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
相关产品推荐
相关产品推荐

