最近在搞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 【已解决】相关推荐

  1. STM32芯片解锁读写保护:更改Option Byte [Error已解决]

    STM32芯片解锁读写保护:更改Option Byte [Error已解决] 问题描述 解决办法 原理:RDP保护级别 问题描述 STM32使用中经常见到芯片设置了读保护(芯片被锁住),导致无法读取. ...

  2. IDEA闪退提示:There is not enough memory to perform the requested operation..【已解决】直接有效

    今天在Maven项目中引入支付宝支付依赖时idea一直弹出警告框提示: There is not enough memory to perform the requested operation.. ...

  3. 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] 拒绝访问(已解决) ...

  4. c++: internal compiler error: 已杀死 (program cc1plus)的解决方法

    c++: internal compiler error: 已杀死 (program cc1plus) 由于我的虚拟机在创建的时候内存只设了1个G,今天在catkin_make ros工程的时候出现了 ...

  5. 已解决selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary

    已解决selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary ...

  6. 已解决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 ...

  7. 已解决RuntimeError: CUDA error: device-side assert triggered异常的正确解决方法,亲测有效!!!

    已解决RuntimeError: CUDA error: device-side assert triggered异常的正确解决方法,亲测有效!!! 文章目录 报错问题 解决方法 福利 报错问题 粉丝 ...

  8. (已解决)oracle 查询数据一直提示:“error code [17004]; 无效的列类型”

    解决方法:传入的键值对,要对应数据库的字段类型. 比如oracle的varchar,varchar2要对应 java 的string , number要对应java的long. 今天在上班启动系统的时 ...

  9. 出现错误(已解决)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 ...

最新文章

  1. 系统linux/redhat6.5 zabbix 2.47监控nginx1.8.0 (下)
  2. php 多图上传编辑器,laravel中使用WangEditor及多图上传
  3. GsonBuilder
  4. conj--复数的共轭值
  5. java list布局_java – 使用2种不同的布局重用Android Listvi...
  6. 几种流行的AJAX框架:jQuery,Mootools,Dojo,Ext JS的对比
  7. 【解题报告】Leecode 2057. 值相等的最小索引——Leecode周赛系列
  8. Java 11:String类中的新方法
  9. 小程序分享到朋友圈功能_小程序开发日记 分享到朋友圈
  10. SQL Server -- 如何书写优雅、漂亮的SQL脚本?
  11. 【英语学习】【Daily English】U11 Work L03 He is a had guy to work for
  12. HDU 5950 Recursive sequence(矩阵快速幂)
  13. Mac下配置PHP+Apache+phpMyAdmin+MySql远程链接
  14. Python 添加类型标注 | 散发着自由松散气息的代码
  15. Spark系列(三)SparkContext分析
  16. Mybatis原生dao开发方法实现增删改查
  17. JVisualVM的使用实录
  18. Tribon参数化建模之__对型材端切的参数化建模解析
  19. APP性能测试之jmeter
  20. oracle sqlplus命令详解(官方示例)

热门文章

  1. 软件测试--测试用例
  2. GIF图片如何用Photoshop去水印?
  3. Linux - 如何查看Ubuntu系统的版本信息
  4. HTML5开发系列(4) 之 样式表的三种类型
  5. python爬取图片然后保存在文件夹中
  6. Gram矩阵和核函数
  7. php中文加密解密算法,一组PHP可逆加密解密算法
  8. idea如何查看已安装的插件
  9. jquery ajax封装通用方法
  10. 利用HTML+CSS进行页面布局(div的浮动效果)