Pytorch报错:one of the variables needed for gradient computation has been modified by an inplace opera
使用一个pytorch写的模型时,训练到45epoch时,报错:RuntimeError:one of the variables needed for gradient computation has been modified by an inplace operation
But this error just appears in some places. Why it occurs?
Because the inplace op overwrites some data that’s needed by some Function to compute the gradient. It has no way of doing that after you overwrite it. Just remove inplace=True
in these places.
- 错误分析:由于pytorch升级到pytorch0.4之后,与之前pytorch0.3的用法发生来了一些变化,比如最重要的在pytorch0.4中将Tensor与Variance都组合成了同一个东西,pytorch0.4不再支持inplace操作。
- 解决方法:基本网上我能看到的所有资料,可执行的方案主要有以下几点:
- 解决方案1:把所有的
inplace=True
改成inplace=False
- 解决方案2:将
out+=residual
这样所有的+=
操作,改成out=out+residual
- 解决方案3: 将pytorch版本回退到0.3,或者添加一个pytorch0.3的conda环境。
此类问题的一点总结:以上的方案1与方案2其实都是在解决pytorch0.4不能处理inplace操作的问题。但是其实都不全。
举个简单的例子来理解一下inplace=True与inplace=False,就像所有的博客里给出的+=
这个操作。x+=1
是在x的基础上直接做加法操作的,这个就属于在原来的x上做扩展,是inplace=True的情况。而x=x+1
就是先做加法,然后重新赋值,就是inplace=False。
但是我们要注意到+=
只是inplace的一种操作,并不是把所有的+=
替换掉就可以解决问题的。在这篇博客pytorch 学习笔记(二十二):关于 inplace operation中给出了完整的说明,非常建议看看。
总结一下:如果你的程序比较简短,情况比较简单,那么就直接改里面的+=
这样的inplace操作。另外在修改的时候可以用variance.backward()
来试试这个variance之前的代码是不是都已经正确了。 如果代码量比较大,那还是建议用conda再创建一个环境,用来安装pytorch0.3,简单省事。
- 创建一个名为
pytoch0.3
的conda环境:conda create -n pytorch0.3 python=3.6
; - 激活
pytorch0.3
环境:source activate pytorch0.3
,这时中断提示符前面会多一个pytorch0.3标记; - 要关闭
pytorch0.3
环境,就用:source deactivate
; - 在里面用conda安装0.3版本的pytorch:先在官网下载对应的版本
torch-0.3.1-cp36-cp36m-linux_x86_64.whl
,进入目录用pip install torch-0.3.1-cp36-cp36m-linux_x86_64.whl
命令安装pytorch,然后再用pip install torchvision
安装torchvision。
- 使用ControllerAdvice注意事项,Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.
- rac节点无法启动ORA-29702的问题及分析(70天)
- SpringMVC,SpringBoot文件下载
- SpringCloud学习1-服务注册与发现(Eureka)
- 物化视图全量刷新与insert的redo生成量测试(69天)
- SpringCloud学习2-Springboot监控模块(actuator)
- 原码,反码,补码 与(&) 或(|) 非(~) 异或(^) 左移 << 右移 >> 无符号右移 >>>
- lombok使用基础教程
- 【Android基础】Android中的Intent详解
- 关于SCN的总结测试 (68天)
- 利用主成分分析构建股票指数
- Java对象的序列化和反序列化源码阅读
- hexo 博客支持PWA和压缩博文
- Hexo next博客添加折叠块功能添加折叠代码块
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【干货满满】1.5w字初中级前端面试复习总结
- 娱乐圈排行榜动态条形图绘制
- vue3.0的 v-model 为啥不好用了?
- SHELL命令分组统计
- 一行代码实现display"过渡动画"原理
- 3D星空图
- shading-jdbc 4.1.1 + tk.mybatis + pagehelper 1.3.x +spring boot 2.x 使用注意事项
- 用辗转相除法求两个正整数的最大公约数
- Js根据数组相同的值生成二维数组
- 顺序消息管道《Message Pipe》v1.0.2版本发布
- Ts安装及自动编译ts文件
- python 自动化测试(1):获取验证码图片,实现自动登录
- RocketMQ学习第一步之源码构建
- python 库学习之:openpyxl
- python 学习之:读取xml配置文件