PyTorch报错:需梯度的叶子变量视图被用于原位操作如何解决
报错原因
你当前运行的是基于PyTorch 0.3开发的老代码,使用的PyTorch版本是1.3以上的更新版本,版本迭代带来的API行为变更、梯度检查逻辑变严格是触发报错的核心原因。
解决方案
核心RuntimeError修复
报错RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation.是因为新版本PyTorch对需要计算梯度的叶子张量的in-place操作做了强校验,老版本允许的操作现在会直接报错,修复方式如下:
- 定位到报错文件
/content/ncnet/lib/conv4d.py的第52行、126行附近的逻辑:- 所有带
_后缀的in-place操作(如add_/mul_/resize_等)全部替换为非in-place版本,例如将x.add_(y)修改为x = x + y - 如果存在对张量视图的修改操作,先调用
.clone()生成新张量再操作,例如将x[..., :2] *= 2修改为x = x.clone(); x[..., :2] *= 2
- 所有带
- 如果当前是模型评估阶段,不需要计算梯度,可以直接在
eval_pf_pascal.py开头导入torch后添加以下代码,全局禁用梯度即可绕过检查:
torch.set_grad_enabled(False)
Warning消除方案
align_corners行为变更警告
找到代码中所有调用torch.nn.functional.grid_sample、affine_grid的位置,显式传入align_corners=True参数,即可和PyTorch 0.3的旧逻辑保持一致,消除警告。
命名张量实验特性警告
该警告不影响正常运行,如需消除可以将PyTorch升级到1.10及以上正式版本,命名张量相关API已经稳定,不会再抛出该提示。
兜底兼容方案
如果修改代码成本过高,可以直接安装PyTorch 0.3版本及对应的Python 3.5/3.6运行环境,即可完全兼容老代码逻辑。
内容的提问来源于stack exchange,提问作者SRTF
相关产品推荐
相关产品推荐

