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

训练64x64图像的5层CNN模型为何出现Kernel size错误?

问题分析与解决方案

问题核心是图像经过多层卷积和池化后,尺寸缩小到无法容纳3×3卷积核,同时全连接层的输入特征数计算完全错误。我们一步步拆解64×64图像在你的模型中的尺寸变化:

初始输入:(3, 64, 64)

  1. 第一层Conv2d(kernel=3,默认padding=0、stride=1):输出尺寸 = (64 - 3)/1 + 1 = 62 → 经过MaxPool2d(2)后,尺寸变为(32, 31, 31)(池化向下取整)
  2. 第二层Conv2d(3):31 - 3 + 1 = 29 → MaxPool2d(2)后变为(64, 14, 14)
  3. 第三层Conv2d(3):14 - 3 + 1 = 12 → MaxPool2d(2)后变为(128, 6, 6)
  4. 第四层Conv2d(3):6 - 3 + 1 = 4 → MaxPool2d(2)后变为(256, 2, 2)
  5. 第五层Conv2d(3):此时输入尺寸仅为2×2,远小于3×3的卷积核,直接触发你看到的错误。

另外你最后全连接层写的in_features=512 * 8 * 8完全不符合实际流程,即使前面能运行,Flatten后的特征数也不是这个值。

解决办法

方法1:给卷积层加padding保持尺寸

在所有Conv2d层添加padding=1(当kernel_size=3时,padding=1能让卷积后尺寸不变),配合MaxPool2d(2)每次将尺寸减半,全程不会出现尺寸过小的问题:

CNN5Layers = nn.Sequential(
    nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2),
    nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2),
    nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2),
    nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2),
    nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2),
    nn.Flatten(),
    nn.Linear(in_features=512 * 2 * 2, out_features=1024),  # 64经过5次减半后为2
    nn.ReLU(),
    nn.Linear(in_features=1024, out_features=512),
    nn.ReLU(),
    nn.Linear(in_features=512, out_features=30)
)

方法2:减少池化层数量

如果不想加padding,可以去掉最后一个MaxPool2d,这样第五层卷积前的尺寸为4×4,能容纳3×3卷积核,同时修正全连接层特征数:

CNN5Layers = nn.Sequential(
    nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2),
    nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2),
    nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2),
    nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2),
    nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3),
    nn.ReLU(),
    # 移除最后一个MaxPool2d
    nn.Flatten(),
    nn.Linear(in_features=512 * 2 * 2, out_features=1024),
    nn.ReLU(),
    nn.Linear(in_features=1024, out_features=512),
    nn.ReLU(),
    nn.Linear(in_features=512, out_features=30)
)

关键注意点

  • 新增卷积/池化层时,必须手动计算输出尺寸,避免输入尺寸小于卷积核的情况
  • 全连接层的in_features必须和Flatten后的特征数完全匹配,否则会触发维度不匹配错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:03:31