PyTorch中ReLU引发Autograd原地操作错误的原因排查
残差网络原地操作错误的分析与解决
问题本质
你碰到的RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation错误,和ReLU本身没关系,问题出在最后一行的out += shortcut——这是个原地修改张量的操作。
F.relu()确实不是原地操作,但加了第二个ReLU后,out的计算图和shortcut(也就是输入x)的依赖逻辑变了:Autograd要计算梯度,得保留out的原始数据,但out += shortcut直接在原张量上改值,把梯度追踪需要的中间状态搞坏了。之前注释掉ReLU没报错只是巧合,PyTorch的Autograd刚好没触发这个检测,但原地操作本身就不符合梯度计算的要求。
修复方法
把原地加法换成普通加法就行,修改残差块的forward方法:
def forward(self, x): shortcut = x out = F.relu(self.bn1(self.conv1(x))) out = self.bn2(self.conv2(out)) out = F.relu(out) # 现在不会报错了 out = out + shortcut # 替换原地加法为非原地操作 return out
也可以用out += shortcut.clone(),但直接用out = out + shortcut更直观,它会生成新张量,彻底规避原地修改的问题。
验证效果
把你的最小复现示例里的残差块按上面改完,就能正常训练,不会再出现原地操作的报错。
内容的提问来源于stack exchange,提问作者Trailblazer
相关产品推荐
相关产品推荐

