inplace-operation-error 【已解决】

news2024/12/23 8:10:47

最近在搞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 src

    def forward(self, src, pos, reference_points, spatial_shapes, level_start_index, padding_mask=None):
        # self attention
        src2 = 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)

        # ffn
        src = 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_main
                        del output_meta
                    # batch for meta update
                    if do_backprop:
                        ## 反向传播梯度
                        self.amp_grad_scaler.scale(l1).backward()
                        # unscale 梯度,可以不影响clip的threshold
                        self.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_meta
                        output_main=self.network(data_main)
                        del data_main
                        Ladapt=self.loss(output_meta,target_meta)
                        Lrecall=self.loss(output_main,target_main)
                        del output_main
                        del output_meta
                        del target_meta
                        ## theta hat (meta-updata)
                        l2=self.meta_beta*Lrecall+self.meta_gama*Ladapt+Lmain
                        
                    if do_backprop:
                        ## 反向传播梯度
                        self.amp_grad_scaler.scale(l2).backward()
                        # unscale 梯度,可以不影响clip的threshold
                        self.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()

后面就没事了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/417473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UNET-RKNN分割眼底血管

前言 最近找到一个比较好玩的Unet分割项目,Unet的出现就是为了在医学上进行分割(比如细胞或者血管),这里进行眼底血管的分割,用的backbone是VGG16,结构如下如所示(项目里面的图片,借用的!借用标记出处&…

C语言函数大全--h开头的函数

C语言函数大全 本篇介绍C语言函数大全–h开头的函数或宏 1. hypot,hypotf,hypotl 1.1 函数说明 函数声明函数功能double hypot(double x, double y);计算直角三角形的斜边长(double)float hypotf (float x, float y);计算直角…

UPA/URA双极化天线的协方差矩阵结构

文章目录UPA的阵列响应向量(暂不考虑双极化天线)UPA阵列响应:从单极化天线到双极化天线UPA双极化天线的协方差矩阵结构参考文献UPA的阵列响应向量(暂不考虑双极化天线) 下图形象描述了UPA阵列的接收信号 UPA阵列的水平…

【springcloud 微服务】Spring Cloud 微服务网关Gateway使用详解

目录 一、微服务网关简介 1.1 网关的作用 1.2 常用网关 1.2.1 传统网关 1.2.2 云原生网关 二、gateway网关介绍 2.1 问题起源 2.2 引发的问题 2.2.1 重复造轮子 2.2.2 调用低效 2.2.3 重构复杂 2.3 gateway改进 三、Spring Cloud Gateway 介绍 3.1 Gateway 概述 …

【JSON学习笔记】3.JSON.parse()及JSON.stringify()

前言 本章介绍JSON.parse()及JSON.stringify()。 JSON.parse() JSON 通常用于与服务端交换数据。 在接收服务器数据时一般是字符串。 我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。 语法 JSON.parse(text[, reviver])参数说明: text:必需&…

Angular可视化指南 - 用Kendo UI图表组件创建数据可视化

Kendo UI for Angular是专业级的Angular UI组件库,不仅是将其他供应商提供的现有组件封装起来,telerik致力于提供纯粹高性能的Angular UI组件,而无需任何jQuery依赖关系。无论您是使用TypeScript还是JavaScript开发Angular应用程序&#xff0…

【机器学习(二)】线性回归之梯度下降法

文章目录专栏导读1、梯度下降法原理2、梯度下降法原理代码实现3、sklearn内置模块实现专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《数据分析之术》,本专栏精选了经典的机器…

1漏洞发现

漏洞发现-操作系统之漏洞探针类型利用修复 一、操作系统漏洞思维导图 相关名词解释: CVSS(Common Vulnerability Scoring System,即“通用漏洞评分系统”) CVSS是安全内容自动化协议(SCAP)的一部分通常C…

rockchip rk3588添加uvc及uvc,adb的复合设备

软硬件环境: 软件基础:我目前拿到的rk3588 sdk :gitwww.rockchip.com.cn:2222/Android_S/rk3588- manifests.git硬件基础:RK3588 LP4X EVB uvc_app: 从rv1126 sdk中rv1126_sdk/rv1126/external/uvc_app 目录移植而来。移植后&…

能翻译大量文字的软件-正规的翻译软件

复制自动翻译软件是一种能够复制并自动翻译文本的工具。当您阅读某一种语言的文本时,这种软件可以快速识别并翻译出来,以方便您更好地理解内容。与其他翻译软件不同的是,复制自动翻译软件可以直接在游览网站的过程中,直接对用户正…

【C++】命名空间,缺省参数,函数重载,引用,内联函数

目录1. 命名空间2. 输入输出3. 缺省参数4. 函数重载为什么C支持函数重载?5. 引用5.1 引用作函数参数(输出型参数)5.2 作函数的返回值关于函数的返回值:5.3 引用权限关于类型转换:5.4 引用和指针6. 内联函数6.1 C推荐的…

【千题案例】TypeScript获取两点之间的距离 | 中点 | 补点 | 向量 | 角度

我们在编写一些瞄准、绘制、擦除等功能函数时,经常会遇到计算两点之间的一些参数,那本篇文章就来讲一下两点之间的一系列参数计算。 目录 1️⃣ 两点之间的距离 ①实现原理 ②代码实现及结果 2️⃣两点之间的中点 ①实现原理 ②代码实现及结果 3…

JUC结构

JUC是java.util.concurrent包的简称在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!进程与线程的区别:进程 : 一个运行中的程序的集合; 一个进程往往可以包含多个线程,至少包含一个线程…

count、sum、avg、max、min函数MySQL数据库 - 使用聚合函数查询(头歌实践教学平台)

文章目的初衷是希望学习笔记分享给更多的伙伴,并无盈利目的,尊重版权,如有侵犯,请官方工作人员联系博主谢谢。 目录 第1关:COUNT( )函数 任务描述 相关知识 COUNT()函数基本使用 编程要求 第2关:SUM(…

3.Java运算符

Java运算符 运算符基本分为六类:算数运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、三元(条件)运算符。 一、算术运算符 算数运算符,是指在Java运算中,计算数值类型的计算符号,既然是操作数值…

ubuntu下安装与配置samba

参考文章: https://blog.csdn.net/xurongxin2006/article/details/127740629 https://blog.csdn.net/weixin_42758707/article/details/129855529 https://www.linuxidc.com/Linux/2018-11/155466.htm https://blog.csdn.net/flyingcys/article/details/50673167 1、…

SGD,Adam,AdamW,LAMB优化器

一. SGD,Adam,AdamW,LAMB优化器 优化器是用来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值,从而最小化(或最大化)损失函数。 1. SGD 随机梯度下降是最简单的优化器,它采用了简单的…

Qt音视频开发37-识别鼠标按下像素坐标

一、前言 在和视频交互过程中,用户一般需要在显示视频的通道上点击对应的区域,弹出对应的操作按钮,将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合,发送出去,通知其他设备进行处理。比如识别到很多人脸&…

使用 gzip 压缩数据

gzip 是GNU/Linux平台下常用的压缩软件,处理后缀名.gz的文件。 gzip 、 gunzip 和 zcat 都可以处理这种格式的。但这些工具只能压缩/解压缩单个文件或数据流,无法直接归档目录和多个文件。但是, gzip 可以同tar 和 cpio 这类归档工具配合使用…

JavaWeb——网络的基本概念

目录 一、IP地址 1、定义 2、格式 (1)、A类地址 (2)、B类地址 (3)、C类地址 (4)、特殊地址 二、端口号 三、协议 四、协议分层 1、定义 2、分类 (1&#xf…