inplace-operation-error 【已解决】
最近在搞CT医学图像分割模型的领域泛化优化,结果就出现了报错:
关于这个问题stackoverflow上有非常多的讨论,可以过去围观:
指路:中文版stackoverflow - 堆栈内存溢出 (stackoom.com)
Stack Overflow - Where Developers Learn, Share, & Build Careers
看了很多问题和我这个问题都不太一样。
one of the variables needed for gradient computation has been modified by an inplace operation 归根结底是梯度计算所需的变量之一已被就地操作修改,相信大家都已经尝试过用
with torch.autograd.set_detect_anomaly(True)来查看问题出错的地方,一般能够通过这个方法来找出错误的人,可以看看报错问题的附近能不能使用.clone()或者将+=和*=写完整,这些一般是修改模型时出问题可以考虑的。
但是我是做领域泛化优化的,只改进了训练方式,并没修改模型。在做优化前,我的模型可以正常运行,但是报错却指出我的normalization有问题,如下图所示:
找一下附近的代码:
def forward_ffn(self, src):src2 = self.linear2(self.dropout2(self.activation(self.linear1(src))))src = src.clone() + self.dropout3(src2)src = self.norm2(src)return srcdef forward(self, src, pos, reference_points, spatial_shapes, level_start_index, padding_mask=None):# self attentionsrc2 = self.self_attn(self.with_pos_embed(src, pos), reference_points, src, spatial_shapes, level_start_index, padding_mask)src = src.clone() + self.dropout1(src2)src = self.norm1(src)# ffnsrc = self.forward_ffn(src)return src
发现这边的代码写得没毛病啊,到底是哪里的问题呢?
后来仔细观察了一下改写后的训练代码
self.optimizer.zero_grad()self.meta_optimizer.zero_grad()if self.fp16:with torch.autograd.set_detect_anomaly(True):with autocast():output_meta=self.network(data_meta)output_main=self.network(data_main)## theta hat (meta-updata)l1=self.loss(output_meta,target_meta)Lmain=self.loss(output_main,target_main)del output_maindel output_meta# batch for meta updateif do_backprop:## 反向传播梯度self.amp_grad_scaler.scale(l1).backward()# unscale 梯度,可以不影响clip的thresholdself.amp_grad_scaler.unscale_(self.meta_optimizer)# 梯度裁剪,防止梯度爆炸torch.nn.utils.clip_grad_norm_(self.network.parameters(), 12)# 更新模型参数self.amp_grad_scaler.step(self.optimizer)self.amp_grad_scaler.update()self.meta_optimizer.zero_grad()with autocast():output_meta=self.network(data_meta)del data_metaoutput_main=self.network(data_main)del data_mainLadapt=self.loss(output_meta,target_meta)Lrecall=self.loss(output_main,target_main)del output_maindel output_metadel target_meta## theta hat (meta-updata)l2=self.meta_beta*Lrecall+self.meta_gama*Ladapt+Lmainif do_backprop:## 反向传播梯度self.amp_grad_scaler.scale(l2).backward()# unscale 梯度,可以不影响clip的thresholdself.amp_grad_scaler.unscale_(self.optimizer)# 梯度裁剪,防止梯度爆炸torch.nn.utils.clip_grad_norm_(self.network.parameters(), 12)# 更新模型参数self.amp_grad_scaler.step(self.meta_optimizer)self.amp_grad_scaler.update()
文章经过四次前向传播,和两次反向传播,但是每次都是第二次反向传播出错,主要原因在于第二次反向传播用到的loss函数中,用到了第一次反向传播之前计算的一个Loss,因此,直接使用该loss就会出现inplace operation error,因此需要Detach一下将其复制过来,而不是在原来的地址上操作。
l2=self.meta_beta*Lrecall+self.meta_gama*Ladapt+Lmain.detach()
后面就没事了!
inplace-operation-error 【已解决】相关推荐
- STM32芯片解锁读写保护:更改Option Byte [Error已解决]
STM32芯片解锁读写保护:更改Option Byte [Error已解决] 问题描述 解决办法 原理:RDP保护级别 问题描述 STM32使用中经常见到芯片设置了读保护(芯片被锁住),导致无法读取. ...
- IDEA闪退提示:There is not enough memory to perform the requested operation..【已解决】直接有效
今天在Maven项目中引入支付宝支付依赖时idea一直弹出警告框提示: There is not enough memory to perform the requested operation.. ...
- pip install 时报错 ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问(已解决)
pip install 时报错 ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问(已解决) ...
- c++: internal compiler error: 已杀死 (program cc1plus)的解决方法
c++: internal compiler error: 已杀死 (program cc1plus) 由于我的虚拟机在创建的时候内存只设了1个G,今天在catkin_make ros工程的时候出现了 ...
- 已解决selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary
已解决selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary ...
- 已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“:
已解决(pip安装pyhanlp模块报错)error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Micr ...
- 已解决RuntimeError: CUDA error: device-side assert triggered异常的正确解决方法,亲测有效!!!
已解决RuntimeError: CUDA error: device-side assert triggered异常的正确解决方法,亲测有效!!! 文章目录 报错问题 解决方法 福利 报错问题 粉丝 ...
- (已解决)oracle 查询数据一直提示:“error code [17004]; 无效的列类型”
解决方法:传入的键值对,要对应数据库的字段类型. 比如oracle的varchar,varchar2要对应 java 的string , number要对应java的long. 今天在上班启动系统的时 ...
- 出现错误(已解决)RuntimeError: CUDA error: no kernel image is available for execution on the device CUDA ker
出现问题(已解决)RuntimeError: CUDA error: no kernel image is available for execution on the device CUDA ker ...
最新文章
- 系统linux/redhat6.5 zabbix 2.47监控nginx1.8.0 (下)
- php 多图上传编辑器,laravel中使用WangEditor及多图上传
- GsonBuilder
- conj--复数的共轭值
- java list布局_java – 使用2种不同的布局重用Android Listvi...
- 几种流行的AJAX框架:jQuery,Mootools,Dojo,Ext JS的对比
- 【解题报告】Leecode 2057. 值相等的最小索引——Leecode周赛系列
- Java 11:String类中的新方法
- 小程序分享到朋友圈功能_小程序开发日记 分享到朋友圈
- SQL Server -- 如何书写优雅、漂亮的SQL脚本?
- 【英语学习】【Daily English】U11 Work L03 He is a had guy to work for
- HDU 5950 Recursive sequence(矩阵快速幂)
- Mac下配置PHP+Apache+phpMyAdmin+MySql远程链接
- Python 添加类型标注 | 散发着自由松散气息的代码
- Spark系列(三)SparkContext分析
- Mybatis原生dao开发方法实现增删改查
- JVisualVM的使用实录
- Tribon参数化建模之__对型材端切的参数化建模解析
- APP性能测试之jmeter
- oracle sqlplus命令详解(官方示例)