PyTorch中'Tensor'对象无'zero_grad'属性的AttributeError问题解决
问题解决:AttributeError: 'Tensor' object has no attribute 'zero_grad'
错误原因
loss是计算后得到的损失张量(Tensor),它本身并没有zero_grad()方法。这个方法属于PyTorch模型(nn.Module)或优化器(Optimizer),作用是清除模型参数的梯度缓存,避免梯度累积影响后续迭代计算。
修正步骤
替换
loss.zero_grad()为net.zero_grad()
每次迭代前需要清除的是模型的梯度缓存,而非损失张量的梯度。修复参数更新的语法错误
sub_方法的参数传递逻辑有误,正确写法是f.data.sub_(learning_rate * f.grad.data),不能用赋值语法传递参数。
修正后的完整代码
lossFunc = torch.nn.MSELoss() for i in range(epoch): output = net(x) loss = lossFunc(output, y) # 清除模型的梯度缓存 net.zero_grad() loss.backward() # 更新模型参数 for f in net.parameters(): f.data.sub_(learning_rate * f.grad.data) print(output, loss)
额外优化建议
更规范的做法是使用PyTorch内置优化器(比如SGD)管理参数更新,代码更简洁且不易出错:
import torch.optim as optim lossFunc = torch.nn.MSELoss() optimizer = optim.SGD(net.parameters(), lr=learning_rate) for i in range(epoch): output = net(x) loss = lossFunc(output, y) optimizer.zero_grad() loss.backward() optimizer.step() # 自动完成参数更新 print(output, loss)
内容的提问来源于stack exchange,提问作者elksie5000
相关产品推荐
相关产品推荐

