PyTorch报错“RuntimeError: one of the variables needed for gradient computation has been modified by……”

1 问题描述

今天在写作DeepLabV3+的代码时,遇到了一个问题,

程序报错:

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [2, 64, 253, 765]], which is output 0 of ReluBackward1, is at version 2; expected version 1 instead.

根据提示信息来说,感觉应该是跟inplace有关的操作出现的问题;

2 解决方案

出现这个问题,我第一时间想到的是就是nn.ReLU()函数出现的问题,因为ReLU()中有一个设置就是是否启用原位操作;

在一般情况下,为了节省内存,都会设置为True;

所以我把所有使用ReLU函数的地方全部排查了一遍,发现问题的原因是使用了两个连续的ReLU(inplace=True)的操作,

触发错误的代码如下:

conv1 = nn.Conv2d(3, 128, kernel_size=1, bias=False)
bn = nn.BatchNorm2d(128)
relu1 = nn.ReLU(inplace = True)
relu2 = nn.ReLU(inplace = True)

input = torch.randn(10,3,8,8)
x = conv1(input)
x = bn(x)
x = relu1(x)

# the second successive inplace ReLU operation
x = relu2(x)

x = x.flatten()
x = torch.sum(x) 
x.backward()

已经提交到PyTorch官方的GitHub上:

https://github.com/pytorch/pytorch/issues/34429

3 备忘

3.1 连续使用ReLU(inplace=True)和+=原位操作的bug已经修复

GitHub的上关于“连续使用ReLU(inplace=True)和+=原位操作的bug已经修复”,issue的链接如下:

https://github.com/pytorch/pytorch/issues/5687#issuecomment-412681482

3.2 不能使用原位操作修改叶子节点

PyTorch不允许直接使用原位操作修改叶子节点,如果需要修改,

可以参考下面的链接:https://zhuanlan.zhihu.com/p/38475183

3.3 可以使用Tensor.sum.backward()来辅助定位可能出现错误的代码位置

我们可以使用Tensor.sum.backward()来辅助定位可能出现错误的代码位置;

你可能感兴趣的:(PyTorch学习,PyTorch)