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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:20:36