You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:44:52