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

PyTorch训练自定义模型报element 0 of tensors does not require grad错误求助

错误根因

你遇到的报错核心来自训练代码的逻辑错误:你把模型前向推理的代码放在了torch.no_grad()上下文管理器中。
torch.no_grad()的作用是完全关闭上下文内所有运算的梯度记录功能,该环境下生成的所有张量都会被标记为requires_grad=False,也不会保留反向传播需要的计算图节点grad_fn。因此你得到的模型输出outputs本身没有梯度属性,后续基于它计算得到的损失自然无法执行反向传播,触发对应报错。

修复方案

直接删除包裹模型推理的with torch.no_grad()语句即可,修正后的训练逻辑如下:

def train(self, epoch, trainloader):
    self.model.train()
    for batch_idx, (inputs, targets) in enumerate(trainloader):
        lbp = lbp_transform(inputs)
        self.optimizer.zero_grad()
        # 移除torch.no_grad上下文,正常执行前向推理
        outputs = self.model(inputs, lbp)
        loss = self.criterion(outputs, targets)
        loss.backward()
        self.scheduler.step(loss)
        utils.clip_gradient(self.optimizer, 0.1)
        self.optimizer.step()

可选排查点(如果修改后仍报错可逐一校验)

  • 检查lbp_transform实现:确认该变换是否内部使用了numpy运算后再转回PyTorch张量,或者也嵌套了torch.no_grad(),导致输入模型的lbp张量本身不带梯度
  • 检查VGG特征提取器的初始化配置:如果你手动将两个VGG特征提取器的参数全部设置为requires_grad=False,同时后续的注意力层、卷积层、全连接层也都被意外关闭了梯度,也会触发该问题。如果需要冻结主干网络,仅需关闭特征提取器的梯度即可,保证后续自定义层梯度正常开启
  • 检查自定义模块实现:确认AttentionBlock1、AttentionBlock2、conv_layer_relu等自定义模块的运算全部使用PyTorch原生算子实现,没有插入无梯度的自定义运算逻辑

内容的提问来源于stack exchange,提问作者OutOfMind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:36:01