您似乎混淆了图像/特征图的空间维度(高度和宽度),以及“通道维度”,即每个像素存储的信息的维度。
输入图像可以具有任意高度和宽度,但始终具有固定的“通道”尺寸 = 3;也就是每个像素都有一个固定的3维,也就是每个像素颜色的RGB值。
让我们将输入形状表示为3xHxW(3 个 RGB 通道,高度为 H,宽度为 W)。
使用kernel_size=5 和output_channel=64 进行卷积,意味着您有 64 个大小为 3x5x5 的过滤器。对于每个过滤器,您获取图像中所有重叠的3x5x5 窗口(RGB x 5 x 5 像素)并为每个过滤器输出一个数字,该数字是输入 RGB 值的加权和。对所有 64 个过滤器执行此操作将为每个滑动窗口提供 64 个通道,或形状为64x(H-4)x(W-4) 的输出特征图。
带有kernel_size=3 和output_channels=128 的附加卷积层将有128 个形状为64x3x3 的过滤器应用于输入特征图os 形状64x(H-4)x(W-4) 中的所有3x3 滑动窗口,从而产生形状为@ 的输出特征图987654332@.
您可以以类似的方式继续使用额外的卷积甚至池化层。
This post 很好地解释了卷积/池化层如何影响特征图的形状。
回顾一下,只要不改变输入通道的数量,你就可以对任意空间维度的图像应用全卷积网络,从而得到不同的输出特征图的空间形状,但总是具有相同数量的通道。
至于全连接(又名内积/线性)层;该层不关心空间维度或通道维度。全连接层的输入被“展平”,然后权重的数量由输入元素的数量(通道和空间组合)和输出的数量决定。
例如,在 VGG 网络中,当在 3x224x224 图像上进行训练时,最后一个卷积层输出一个形状为 512x7x7 的特征图,然后将其展平为 25,088 维向量并馈入具有 4,096 个输出的全连接层。
如果您要为 VGG 提供不同空间维度的输入图像,例如 3x256x256,您的最后一个卷积层将输出形状为 512x8x8 的特征图——请注意通道维度 512 没有发生变化,但空间尺寸从 7x7 增长到 8x8。现在,如果你要“展平”这个特征图,你的全连接层将有一个 32,768 维的输入向量,但是,你的全连接层需要一个 25,088 维的输入:你会得到一个RunTimeError。
如果您要将全连接层转换为具有kernel_size=7 和output_channels=4096 的卷积层,它将对512x7x7 输入特征图执行完全相同的数学运算,以生成4096x1x1 输出特征。
但是,当您向其提供 512x8x8 特征图时,它不会产生错误,而是输出 4096x2x2 输出特征图 - 调整了空间维度,固定了通道数。