我正在阅读多个相互冲突的 Stackoverflow 帖子,我对现实情况感到非常困惑。
我的问题如下。如果我在 128x128x3
图像上训练 FCN,是否可以提供大小为 256x256x3
或 B)128x128
或 C) 的图像因为训练和测试期间的输入必须相同?
考虑这样post #1 。在这篇文章中,它建议图像在输入和输出期间必须具有相同的尺寸。这对我来说很有意义。
所以post #2 :在这篇文章中,它建议我们可以在测试期间转发不同大小的图像,如果您执行一些奇怪的挤压操作,则这是可能的。完全不确定这怎么可能。
所以post #3 :在这篇文章中,它建议只需要深度相同,而不需要高度和宽度相同。这怎么可能?
据我了解,底线是,如果我在128x128x3
上训练,那么从输入层到第一个转换层,(1)有一个固定的数字所发生的进步。因此,(2) 是固定的特征图大小,相应地,(3) 是固定数量的权重。如果我突然将输入图像大小更改为 512x512x3
,则由于大小差异除非,训练和测试的特征图根本无法进行比较。。 p>
- 当我输入尺寸为
512x512
的图像时,仅考虑顶部128x128
,而忽略图像的其余部分 - 512x512 图像在传送到网络之前会调整大小。
有人可以澄清一下吗?正如您所看到的,有多个帖子与此相关,但没有规范的答案。因此,每个人都同意的社区辅助答案将非常有帮助。
最佳答案
这是我的分割,
帖子 1
是的,这是做事的标准方式。如果您有可变大小的输入,您可以裁剪/填充/调整它们的大小,以便您的输入大小相同。
帖子 2
请注意,这个人正在谈论“全卷积网络”而不是“全连接网络”。在全卷积网络中,所有层都将是卷积层,只要 channel 尺寸固定,卷积层就不会消耗任意大小(宽度和高度)的输入。
标准卷积网络需要固定输入大小,因为在将卷积输出馈送到全连接层之前进行了“扁平化”。因此,如果去掉全连接层(即全卷积网络),就不会有这个问题。
帖子 3
它所说的内容与第 2 篇文章基本相同(在我看来)。总而言之,如果您的卷积网络具有完全连接的层,并且您尝试输入可变大小的输入,您将得到 RunTimeError
。但是如果你有一个卷积输出并且输入 7x7x512
(h x w x channel )输入您将得到 (1x1x<output_channel>)
输出,如果您输入 8x8x512
输入,你会得到 (2x2x<output_channel>)
输出(由于卷积运算)。
结论
最重要的是,如果您的网络在某处具有完全连接的层,则您无法直接提供可变大小的输入(无需填充/裁剪/调整大小),但如果您的网络是完全卷积的,则可以。
我不知道也无法评论的一件事是概率图何时为 [None, n, n, num_classes]
大小(如帖子 #2 中所示),如何将其变为 [None, 1, 1, num_classes]
因为您需要这样做才能执行 tf.squeeze
.
编辑 1:
卷积核/输入/输出的行为方式
我添加此部分是为了阐明当输入大小发生变化时,卷积运算的输入/输出/内核的行为方式。如您所见,输入的更改将更改大小(即高度和宽度尺寸)。但内核(形状为 [height x width x in_channels x out_channels]
在此更改期间不会受到影响。
希望这是有道理的。
关于tensorflow - FCN 训练和测试期间的不同图像尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57349403/