起因
在写自己网络时发现出现错误:
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]
记录一下,这个问题浪费了我俩小时。。。。不记录一下对不起自己