错误:RuntimeError: one of the variables needed for gradient computation has been modified by an inplac

作者在编写网络时遇到RuntimeError,源于尝试在计算梯度的Tensory_上进行inplace操作。通过debug发现错误在于直接赋值,导致梯度计算混乱。解决方案是将元素逐一取出来存储并重新组合。文章提醒注意代码优化,避免此类问题浪费时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因

在写自己网络时发现出现错误:

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation:

去网上搜索了一圈,发现各执一词,要么就是让改relu里的inplace为false,要么就是修改torch版本,或者是有做GAN的xd让该loss的顺序(不太懂这里),看得我一头雾水,于是干脆自己一行一行debug

错误原因

在不断调试后,我将错误定位到了代码里网络的一个模块的forward函数,我里面一个操作是

 y_[0]=tmp[0]

这里提一嘴,y_[0]是一个计算梯度的tensor,tmp是另外一个计算梯度的tensor,我这里想把第一个tensor的第一个元素换成tmp的第一个元素值,于是我直接赋值了。

解决

那显然嘛,报错了,仔细思考应该是两个都计算不同梯度的tensor,将其赋值到一起,那梯度计算肯定出现混乱(个人思考,有更深理解的欢迎讨论),因此,只需要将代码修改一下,我是用的最简单粗暴的,将第一维一个个取出来,存放到list里,然后再cat一下(反正我能跑了~~也没关注代码优化问题,别喷)

updated_y.append(x_y)
for i in range(record_len[i]-1):
    updated_y.append(y_[i+1].unsqueeze(0))
updated_y_tensor=torch.cat(updated_y, dim=0)
# y_[0]=tmp[0]

记录一下,这个问题浪费了我俩小时。。。。不记录一下对不起自己

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值