输入图像大小如何影响全连接层的大小和形状?

How does input image size influence size and shape of fully connected layer?

我正在阅读很多说明两件事的教程。

  1. [用卷积层替换完全连接的层] 将它们转换为完全卷积网络,该网络接受任何大小的输入并输出分类图。” Fully Convolutional Networks for Semantic Segmentation, Shelhamer et al.
  2. 传统的 CNN 无法做到这一点,因为它有一个全连接层,而且它的形状由输入图像的大小决定。

根据这些陈述,我的问题如下?

  1. 每当我制作 FCN 时,我只能让它使用固定尺寸的输入图像进行训练和测试。 但在论文的摘要中,他们指出:"Our key insight is to build “fully convolutional” networks that take input of arbitrary size and produce correspondingly-sized output with efficient inference and learning." 这怎么可能第一层具有固定数量的权重,并且不同尺寸的输入图像不会正确 link 这些权重。
  2. 输入图像大小究竟是如何决定全连接层的?我尝试在网上查找,但找不到直接的答案。
  1. 在训练和测试期间,图像必须具有预定义的大小。对于全连接层,您可以拥有任意数量的节点,并且该数量不取决于输入图像大小或卷积层的输出尺寸。
  2. 输入图像的大小和卷积将决定卷积层的形状和最终的扁平化输出,这些输出将被馈送到全连接层。全连接层可以是任意维度,不依赖于输入图像。 下面是一个示例代码。
    model = Sequential()
    model.add(Conv2D(32, (3,3), activation='relu', input_shape=input_shape))
    model.add(BatchNormalization())
    model.add(Conv2D(64, (3,3), activation='relu'))
    model.add(BatchNormalization())
    model.add(Conv2D(128, (3,3), activation='relu'))
    model.add(BatchNormalization())
    model.add(Conv2D(256, (3,3), activation='relu')
    model.add(BatchNormalization())
    model.add(Conv2D(256, (3,3), activation='relu')
    model.add(MaxPooling2D())
    model.add(BatchNormalization())
    model.add(Flatten())
    model.add(Dense(512, activation='sigmoid')) #This is the fully connected layer, whose dimensions are independent of the previous layers

您似乎混淆了 image/feature 地图的空间尺寸(高度和宽度),而 "channel dimension" 是每个像素存储的信息尺寸。

输入图像可以具有任意高度和宽度,但始终具有固定的 "channel" 尺寸 = 3;即每个像素点的维度固定为3,即每个像素点颜色的RGB值。
让我们将输入形状表示为 3xHxW(3 个 RGB 通道,高度 H 宽度 W)。

应用 kernel_size=5output_channel=64 的卷积意味着您有 64 个大小为 3x5x5 的过滤器。对于每个过滤器,您在图像中获取所有重叠 3x5x5 windows(RGB x 5 x 5 像素)并为每个过滤器输出一个数字,这是输入 RGB 值的加权和。对所有 64 个过滤器执行此操作将为您提供每次滑动 64 个通道 window,或形状为 64x(H-4)x(W-4) 的输出特征图。

额外的卷积层,比如 kernel_size=3output_channels=128 将有 128 个形状 64x3x3 的过滤器应用于输入特征图中的所有 3x3 滑动 windows os shape 64x(H-4)x(W-4) 生成形状为 128x(H-6)x(W-6).

的输出特征图

您可以以类似的方式继续使用额外的卷积甚至池化层。
This post 对 convolution/pooling 层如何影响特征图的形状有很好的解释。

回顾一下,只要不改变输入通道的数量,就可以将全卷积网络应用于任意空间[=]的图像58=] 维度,导致输出特征图的 spatial 形状不同,但始终具有相同数量的 channels.

至于全连接(又名 inner-product/linear)层;该层不关心空间维度或通道维度。全连接层的输入是"flattened",然后权重的数量由输入元素的数量(通道和空间组合)和输出的数量决定。
例如,在 VGG 网络中,在 3x224x224 图像上进行训练时,最后一个卷积层输出形状为 512x7x7 的特征图,然后将其展平为 25,088 维向量并馈入完全连接层4,096 个输出。

如果您要为 VGG 提供不同空间维度的输入图像,例如 3x256x256,您的最后一个卷积层将输出形状为 512x8x8 的特征图——请注意通道维度, 512,没有变化,但空间维度从 7x7 增加到 8x8。现在,如果你要 "flatten" 这个特征图,你的全连接层将有一个 32,768 维的输入向量,但是,唉,你的全连接层需要一个 25,088 维的输入:你将得到一个 RunTimeError .

如果您要将完全连接层转换为具有 kernel_size=7output_channels=4096 的卷积层,它将在 512x7x7 输入特征图上执行完全相同的数学运算,以生成 4096x1x1 输出特征。
然而,当你给它一个 512x8x8 特征图时,它不会产生错误,而是输出一个 4096x2x2 输出特征图——空间维度调整,通道数固定。