文章目录

前言

改代码的时候遇到这个问题RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation,应该是个小细节。

正文

所谓inplace操作就是直接修改地址上的值。

首先是torch中所有加 _ 的函数,x.squeeze_(),x.unsqueeze_()。这些操作直接修改变量,不返回值。

其次一些函数可以通过设置是否inplace,比如Pytorch中 torch.relu()和torch.sigmoid()等激活函数不是inplace操作,其中ReLU可通过设置inplace=True进行inplace操作。

以及一些算术操作,x += res是inplace操作,x = x + res不是。以及一些赋值操作。

如果一些用于backward的值被inplace操作修改了就会报错,所以最好不使用inplace操作,以及将赋值操作放在各种需要计算梯度运算之前,gather要在赋值之后。

解决

可以通过 torch.autograd.set_detect_anomaly(True) 查找问题,如果代码不复杂,可以将所有运算放在 with torch.autograd.set_detect_anomaly(True): 下面,如果比较复杂,放在文件开始即可,最终的错误输出里会显示问题所在。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐