FCN 训练和测试期间的不同图像尺寸

Different image dimensions during training and testing time for FCNs

我正在阅读多个相互矛盾的 Whosebug posts,我真的很困惑现实是什么。

我的问题如下。如果我在 128x128x3 图像上训练 FCN,是否可以提供大小为 256x256x3 或 B)128x128 或 C) 的图像,因为输入必须相同培训和测试?

考虑一下 。在这个 post 中,它建议图像在输入和输出过程中必须具有相同的尺寸。这对我来说很有意义。

SO post #2:在这个post中,它建议我们可以在测试期间转发不同大小的图像,如果你做一些奇怪的挤压操作,这就成为可能。完全不确定这怎么可能。

SO :在这个post中提示只需要深度相同,不需要高宽相同。这怎么可能?

我理解的底线是,如果我在 128x128x3 上训练,那么从输入层到第一个 conv 层,(1) 有一个发生的固定步数。因此,(2) 固定的特征图大小,相应地,(3) 固定数量的权重。如果我突然将输入图像大小更改为 512x512x3,则训练和测试的特征图甚至无法比较,因为大小不同 UNLESS.

  1. 当我输入尺寸为 512x512 的图像时,只有顶部 128x128 被考虑,图像的其余部分被忽略
  2. 512x512 图像在传送到网络之前调整大小。

有人可以澄清一下吗?如您所见,有多个 post 与此相关,但没有一个规范的答案。因此,每个人都同意的社区辅助答案将非常有帮助。

这是我的细分,

Post 1

是的,这是做事的标准方式。如果你有可变大小的输入,你 crop/pad/resize 它们这样你的输入都是相同的大小。

Post 2

注意这个人说的是 "fully convolutional network" 而不是 "fully connected network"。在全卷积网络中,所有层都是卷积层,只要通道维度固定,卷积层就可以处理任意大小(宽度和高度)的输入。

标准卷积网络需要固定输入大小,因为 "flattening" 在将卷积输出馈送到完全连接的层之前完成。因此,如果你摆脱了完全连接的层(即完全卷积网络),你就不会有这个问题。

Post 3

说的和Post2(在我眼里)基本一样。总而言之,如果您的卷积网络有一个全连接层,并且您尝试输入可变大小的输入,您将得到 RunTimeError。但是如果你有一个卷积输出并且你输入一个 7x7x512 (h x w x channel) 输入你会得到一个 (1x1x<output_channel>) 输出,如果你输入 8x8x512 输入,你会得到一个 (2x2x<output_channel>)输出(因为卷积运算)。

结论

底线是,如果你的网络在某处有完全连接的层,你不能直接提供可变大小的输入(没有 pad/crop/resize),但如果你的网络是完全卷积的,你可以。

有一件事我不知道也不能评论,当概率图的大小为 [None, n, n, num_classes] 时(如 Post #2),如何将其带到 [None, 1, 1, num_classes] 因为你需要这样做才能执行 tf.squeeze.

编辑 1:

卷积 kernel/input/output 的行为方式

我添加此部分是为了阐明卷积运算的 input/output/kernel 在输入大小发生变化时的行为方式。如您所见,输入的变化将改变尺寸(即高度和宽度尺寸)。但是内核(形状为 [height x width x in_channels x out_channels] 在此更改期间不会受到影响。

希望这是有道理的。