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

