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

PyTorch实现ConvNet时tensor经过input_net变为NoneType报错如何解决

问题原因与修复方案

核心报错根因

PreActResnetBlock类的forward方法执行完残差计算后没有返回结果,调用该模块后输出默认是None,这就是输入经过self.input_net后变成None的直接原因。
原代码对应逻辑:

def forward(self, x):
    out = self.net(x)
    out += x
# 缺失返回值语句,模块输出默认为None

其他隐藏问题

还有两个会触发后续报错的问题需要同步修复:

  • 分类头output_net中,经过MaxPool2d输出的是4维张量(格式为[批量数, 通道数, 高度, 宽度]),无法直接输入到全连接Linear层,需要先添加nn.Flatten()层将特征展平为2维格式[批量数, 特征维度]。
  • (可选兼容逻辑)如果后续需要在PreActResnetBlock中用到输入输出通道数/步长不一致的场景,需要给残差分支加投影层,否则维度不匹配会触发相加报错,当前调用场景都是输入输出维度一致所以暂时不影响。

修复后的关键代码片段

修复PreActResnetBlock

class PreActResnetBlock(nn.Module):
  def __init__(self, c_in, c_out, kernel=3, stride=1, padding=1):
    """
    Inputs:
          c_in: number of input feeatures
          c_out: numberof output features
          kernel: convolution kernel size
          stride: convolution stride
          padding: convolution padding
    """  
    super().__init__()
    self.net = nn.Sequential(
                  nn.BatchNorm2d(c_in),
                  nn.ReLU(),
                  nn.Conv2d(c_in, c_out, kernel_size=kernel, padding=padding, stride=stride, bias=False)            
    )
    # 可选添加投影层适配维度不一致的场景
    self.shortcut = nn.Identity()
    if c_in != c_out or stride != 1:
        self.shortcut = nn.Conv2d(c_in, c_out, kernel_size=1, stride=stride, bias=False)

  def forward(self, x):
    out = self.net(x)
    out += self.shortcut(x)
    return out # 新增返回值语句

修复output_net

self.output_net = nn.Sequential(
                      nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
                      nn.Flatten(), # 新增展平层
                      nn.Linear(c_out, self.hparams.n_classes)
)

内容的提问来源于stack exchange,提问作者D.Kiji_Noctis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:18:01