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

使用Conv2d训练MNIST模型时遇输入-核尺寸不匹配错误求助

问题分析与解决方法

你遇到的错误是因为卷积层的输入特征图尺寸小于卷积核尺寸(3x3),导致无法完成卷积运算。结合你的模型结构和MNIST输入尺寸(28x28灰度图),我们一步步拆解问题并给出修复方案:

1. 特征图尺寸排查

先逐层计算输出尺寸(初始输入为 (1, 28, 28)):

  • features1层:Conv2d后尺寸保持28x28(padding=1、stride=1),MaxPool2d(2,2)后变为 (16,14,14)
  • features2层:Conv2d后尺寸保持14x14,MaxPool2d(3,2,padding=1)后变为 (32,7,7)
  • features3层:Conv2d后尺寸保持7x7(7≥3,卷积可正常执行),MaxPool2d(3,2,padding=1)后变为 (64,4,4)

这里所有卷积层的输入尺寸都满足要求,但你的全连接层fc1写的是64*3*3,和实际输出的64*4*4不匹配——这说明你预期的特征图尺寸是3x3,但实际计算偏差导致参数调整时可能误操作,间接引发了尺寸异常。

2. 具体修复方案

方案一:调整池化层参数,匹配全连接层维度

将features2的MaxPool2d参数修改为padding=0,让特征图最终输出3x3:

self.features2 = nn.Sequential(
    nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.BatchNorm2d(32),
    nn.MaxPool2d(3, stride=2, padding=0),  # padding改为0
)

此时尺寸链:

  • features2输出:(32,6,6)
  • features3的MaxPool2d(3,2,padding=1)后输出:(64,3,3),刚好适配fc1的64*3*3输入维度。

方案二:修改全连接层输入维度,适配现有特征图

如果不想调整池化层,直接修正fc1的输入维度为实际计算值:

self.fc1 = nn.Linear(64 * 4 * 4, 100)

3. 额外需要修复的细节

  • 代码中forward函数使用了torch.flatten,但开头未导入torch,需补充:
    import torch
    import torch.nn as nn
    
  • 数据集加载代码需要导入依赖模块:
    import torchvision
    from torchvision import transforms
    

4. 快速定位问题的验证方法

可以在forward函数中添加打印语句,实时查看每一层的特征图尺寸:

def forward(self, x):
    print("初始输入:", x.shape)
    x = self.features1(x)
    print("features1输出:", x.shape)
    x = self.features2(x)
    print("features2输出:", x.shape)
    x = self.features3(x)
    print("features3输出:", x.shape)
    x = torch.flatten(x, 1)
    print("flatten后:", x.shape)
    # 后续层逻辑
    return x

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:59:52