Pytorch backward报错2次访问计算图需要retain_graph=True的情况详解
更新时间:2024年02月20日 09:47:04 作者:培之
这篇文章主要介绍了Pytorch backward报错2次访问计算图需要retain_graph=True的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud)
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun)
backward报错2次访问计算图需要 retain_graph=True 的一种情况
错误代码
错误的原因在于
y1 = 0.5*x*2-1.2*x y2 = x**3
没有放到循环里面,没有随着 x 的优化而相应变化。
import torch import numpy as np import torch.optim as optim torch.autograd.set_detect_anomaly(True) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') x = torch.tensor([1.0, 2.0, 3.0,4.5], dtype=torch.float32, requires_grad=True, device=device) y_GT= torch.tensor([10, -20, -30,45], dtype=torch.float32, device=device) print(f'x{x}') optimizer = optim.Adam([x], lr=1) y1 = 0.5*x*2-1.2*x y2 = x**3 for i in range(10): print(f'{i}: x{x}') optimizer.zero_grad() loss = (y1+y2-y_GT).mean() loss.backward() optimizer.step() print(f'{i}: x{x}')
正确代码
import torch import numpy as np import torch.optim as optim torch.autograd.set_detect_anomaly(True) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') x = torch.tensor([1.0, 2.0, 3.0,4.5], dtype=torch.float32, requires_grad=True, device=device) y_GT= torch.tensor([10, -20, -30,45], dtype=torch.float32, device=device) print(f'x{x}') optimizer = optim.Adam([x], lr=1) for i in range(10): print(f'{i}: x{x}') optimizer.zero_grad() y1 = 0.5*x*2-1.2*x y2 = x**3 loss = (y1+y2-y_GT).mean() loss.backward() optimizer.step() print(f'{i}: x{x}')
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持程序员之家。
最新评论