AlexNet 第一个卷积层的输入图像尺寸在理论计算和实际实现中存在 224×224×3 与 227×227×3 的争议,核心原因是原始论文描述与实际卷积计算逻辑的细微差异。可以结合卷积尺寸公式进行推导:
卷积计算公式
卷积输出尺寸公式为:
输出尺寸 = ⌊(输入尺寸 + 2×padding - 卷积核大小) ÷ 步长⌋ + 1
其中,⌊⌋ 表示向下取整,各参数需满足输出尺寸为整数(特征图尺寸必须是整数)。
AlexNet第一个卷积层的参数
根据原始论文,输入图像为 224×224×3, 第一个卷积层的关键参数为:
- 卷积核大小
kernel_size=11 - 步长
stride=4 - 填充
padding=0(无填充) - 输出尺寸明确为
55×55(论文中已说明)
情况1:若输入为 224×224×3,padding=0,代入公式得:
输出尺寸 = ⌊(224 + 2×0 - 11) ÷ 4⌋ + 1 = ⌊213 ÷ 4⌋ + 1 = ⌊53.25⌋ + 1 = 53 + 1 = 54
结果为 54×54,与论文中明确的 55×55 输出尺寸矛盾,因此不合理。
情况2:若输入为 227×227×3,padding=0,代入公式得:
输出尺寸 = ⌊(227 + 2×0 - 11) ÷ 4⌋ + 1 = ⌊216 ÷ 4⌋ + 1 = 54 + 1 = 55
结果为 55×55,与 AlexNet 第一个卷积层的实际输出尺寸(55×55×96)完全匹配。
情况3:若输入为 224×224×3,padding=2,代入公式得:
输出尺寸 = ⌊(224 + 2×2 - 11) ÷ 4⌋ + 1 = ⌊54.25⌋ + 1 = 55
结果为 55×55,与 AlexNet 第一个卷积层的实际输出尺寸(55×55×96)匹配。
情况4:若输入为 224×224×3,padding=3,代入公式得:
输出尺寸 = ⌊(224 + 2×3 - 11) ÷ 4⌋ + 1 = ⌊219 ÷ 4⌋ + 1 = ⌊54.75⌋ + 1 = 55
此时得到的输出尺寸确实是55×55 ,从计算上是合理的。
渊源
原作者 Krizhevsky 当年使用的不是 PyTorch、TensorFlow,而是 Caffe-like 的 CUDA 实现(Alex Krizhevsky’s cuda-convnet)。
在那份代码中:
- 输入是 227×227×3
- 第一层卷积:kernel = 11, stride = 4, padding = 0
- 输出确实是 55×55×96
也就是说:原始论文实现中确实没有用 padding,输入尺寸就是 227×227。
227×227 的来源是:在数据增强时对 256×256 的图像随机裁剪出 227×227 的 patch(不是 224×224)。
关于224×224 + padding=2 的来源
后来(约 2015 年后)各大框架(如 Caffe、Torch7、PyTorch、TensorFlow)都开始统一使用 224×224 输入尺寸。原因不是想“改造 AlexNet”,而是为了 与 VGG、ResNet 等后续网络的输入保持一致。
同时,为了保持第一层输出尺寸一致(仍为 55×55),就必须加上 padding=2:
因此: 224×224 + padding=2 只是一个“数值上等价”的实现,保证输出特征尺寸一致,而非对架构逻辑的更改。
总结
-
如果使用的是 ImageNet 预训练模型(如 PyTorch 的
torchvision.models.alexnet),默认输入是224×224,padding=2。 -
如果是严格复现 原始 Caffe AlexNet,输入应为 227×227,padding=0。
从功能等价与现代实现的角度看,这种写法不会破坏网络结构或性能,因此是一种合理的工程复现方式,并且主流框架(包括 PyTorch 官方)都采用这种做法。

被折叠的 条评论
为什么被折叠?



