我阅读了多个相互矛盾的Stackoverflow帖子,我真的很困惑现实情况到底是什么样的。
我的问题如下。如果我在128x128x3
大小的图像上训练了一个FCN,是否可以输入256x256x3
大小的图像,或者B)128x128
,或者C) 都不能,因为训练和测试时的输入必须相同?
考虑StackOverflow的帖子#1。在这篇文章中,它建议输入和输出的图像必须具有相同的尺寸。这对我来说是合理的。
StackOverflow的帖子#2:在这篇文章中,它建议我们在测试时可以输入不同大小的图像,如果你做了一些奇怪的压缩操作,这是可能的。我完全不确定这是如何可能的。
StackOverflow的帖子#3:在这篇文章中,它建议只需要深度相同,高度和宽度不需要相同。这是怎么可能的?
根据我的理解,底线是,如果我在128x128x3
上进行了训练,那么从输入层到第一个卷积层,(1)会发生固定的步长数。因此,(2)有一个固定的特征图大小,并且相应地,(3)有一个固定的权重数量。如果我突然将输入图像大小更改为512x512x3
,由于尺寸的差异,训练和测试的特征图根本无法比较,除非。
- 当我输入
512x512
大小的图像时,只考虑顶部的128x128
,忽略图像的其余部分 - 在将图像输入网络之前,先对512×512的图像进行缩放。
能有人澄清一下吗?正如你所看到的,关于这个问题有多个帖子,没有一个标准答案。因此,一个社区帮助下的大家都同意的答案将非常有帮助。
回答:
这是我的分析,
帖子1
是的,这是做事情的标准方式。如果你有不同大小的输入,你可以裁剪/填充/调整大小它们,以便你的输入都是相同的大小。
帖子2
注意这个人谈论的是“全卷积网络”,而不是“全连接网络”。在全卷积网络中,所有层都是卷积层,卷积层在消耗任意大小(宽度和高度)的输入时没有问题,只要通道维度是固定的。
需要固定输入大小的原因是,在标准卷积网络中,由于在将卷积输出输入到全连接层之前进行的“扁平化”操作。所以如果你去掉全连接层(即全卷积网络),你就不会有这个问题。
帖子3
它基本上在说和帖子2相同的事情(在我看来)。总结一下,如果你的卷积网络有一个全连接层,并且你尝试输入不同大小的输入,你会得到一个RunTimeError
。但如果你有一个卷积输出,并且你输入一个7x7x512
(高x宽x通道)的输入,你会得到一个(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]
)在这种变化中不会受到影响。
希望这有意义。