PyTorch入门求助:最简网络调用backward()报错排查
PyTorch调用backward()触发RuntimeError的问题解析
问题描述
我刚接触PyTorch,即便在最简单的网络场景中调用backward()也会触发错误。示例代码如下:
(Linear(6, 6)(Variable(torch.zeros([10, 6]))) - Variable(torch.zeros([10, 6]))).backward()
抛出错误:
{RuntimeError}element 0 of variables does not require grad and does not have a grad_fn
问题原因
其实这个报错的核心逻辑很简单——你的计算图里没有任何需要求导的张量,PyTorch找不到反向传播的路径。咱们拆开代码细节来看:
- 你用
Variable(torch.zeros(...))创建的输入张量,默认是关闭梯度追踪的(旧版PyTorch中Variable的requires_grad参数默认是False)。而Linear层的输出能否追踪梯度,完全依赖于输入张量的梯度设置。 - 因为输入没开梯度,Linear层的输出也失去了梯度追踪能力,后续减法得到的最终张量既没有
grad_fn(梯度函数),也标记为不需要求导。当你调用backward()时,PyTorch发现没有可反向传播的节点,自然就抛出了这个错误。
修复方案
你只需要给输入张量开启梯度追踪就行,这里提供两种常用方式:
方式一:旧版Variable写法(指定requires_grad=True)
from torch import nn from torch.autograd import Variable import torch # 给输入变量开启梯度追踪 input_tensor = Variable(torch.zeros([10, 6]), requires_grad=True) target_tensor = Variable(torch.zeros([10, 6])) output = nn.Linear(6, 6)(input_tensor) - target_tensor # 批量张量调用backward需要传入同形状的梯度参数,用于求和计算 output.backward(torch.ones_like(output))
方式二:新版PyTorch推荐写法(直接用tensor)
现在PyTorch已经不再推荐使用Variable,直接用torch.tensor更简洁:
from torch import nn import torch input_tensor = torch.zeros([10, 6], requires_grad=True) target_tensor = torch.zeros([10, 6]) output = nn.Linear(6, 6)(input_tensor) - target_tensor output.backward(torch.ones_like(output))
额外提醒:如果你的输出是标量(比如单个损失值),直接调用backward()即可;但如果是批量的张量(像你代码里的[10,6]形状),需要传入一个和输出形状相同的张量作为参数,告诉PyTorch如何对批量元素的梯度求和。
内容的提问来源于stack exchange,提问作者Funzo
相关产品推荐
相关产品推荐

