【问题标题】:How does input image size influence size and shape of fully connected layer?输入图像大小如何影响全连接层的大小和形状?
【发布时间】:2019-12-11 09:34:54
【问题描述】:

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

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

基于这些陈述,我的问题如下?

  1. 每当我制作 FCN 时,我只能让它使用固定尺寸的输入图像进行训练和测试。 但在论文摘要中,他们指出:“我们的关键见解是构建“完全卷积”网络,该网络接受任意大小的输入,并通过有效的推理和学习产生相应大小的输出。”可能第一层具有固定数量的权重,不同大小的输入图像无法正确链接到这些权重。
  2. 输入图像大小究竟如何决定全连接层?我尝试在网上查找,但找不到直接的答案。

【问题讨论】:

    标签: machine-learning image-processing neural-network computer-vision image-segmentation


    【解决方案1】:

    您似乎混淆了图像/特征图的空间维度(高度和宽度),以及“通道维度”,即每个像素存储的信息的维度。

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

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

    带有kernel_size=3output_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=7output_channels=4096 的卷积层,它将对512x7x7 输入特征图执行完全相同的数学运算,以生成4096x1x1 输出特征。
    但是,当您向其提供 512x8x8 特征图时,它不会产生错误,而是输出 4096x2x2 输出特征图 - 调整了空间维度,固定了通道数。

    【讨论】:

    • 我明白了,我明白你所说的关于全连接层的维度期望。然而,对于完全卷积网络,也许我得到的是以下内容。如果我在 128x128 图像上训练我的 FCN,但在测试时,我想在 224x224 的图像上进行预测,那么我是否必须先将其调整为 128x128?我认为是这种情况,但是,我看到很多存储库,它们能够在测试期间简单地输入不同空间维度的图像。
    • 我知道你可以在任何尺寸的图像上做卷积,但是如果网络已经预训练,那么它有固定数量的权重,输入不同尺寸的图像需要不同的数量重量。
    • 这样一个 repo 的例子如下:github.com/MagicLeapResearch/SuperPointPretrainedNetwork
    • @Jonathan 如果您的架构确实是完全卷积的,那么即使您在 128x128 上进行训练,您也不应该输出大小为 256x256 的预测
    • 那么你能澄清一下我描述的重量问题吗?我和我的很多同学都对这个笔记很困惑。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 2020-04-27
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多