Jon*_*han 5 machine-learning convolution neural-network image-segmentation tensorflow
我正在阅读多个相互冲突的 Stackoverflow 帖子,我对现实情况感到非常困惑。
我的问题如下。如果我在128x128x3图像上训练 FCN ,是否可以输入大小为256x256x3或 B)128x128或 C)的图像,因为在训练和测试期间输入必须相同?
考虑 SO post #1。在这篇文章中,它建议图像在输入和输出期间必须具有相同的尺寸。这对我来说很有意义。
SO post #2:在这篇文章中,它表明我们可以在测试期间转发不同大小的图像,如果您执行一些奇怪的挤压操作,这将成为可能。完全不确定这怎么可能。
SO post #3:在这篇文章中,它表明只有深度需要相同,而不是高度和宽度。这怎么可能?
据我了解,底线是,如果我在 上进行训练128x128x3,那么从输入层到第一个 conv 层,(1)会发生固定数量的步幅。因此,(2)固定的特征图大小,相应地,(3)固定数量的权重。如果我突然将输入图像大小更改为512x512x3,则由于大小的差异UNLESS,因此训练和测试中的特征图无法进行比较。
512x512,只128x128考虑顶部,而忽略图像的其余部分有人可以澄清这一点吗?正如你所看到的,有很多关于这个的帖子没有一个规范的答案。因此,每个人都同意的社区辅助答案将非常有帮助。
这是我的崩溃,
是的,这是做事的标准方式。如果你有可变大小的输入,你可以裁剪/填充/调整它们的大小,以便你的输入都是相同的大小。
请注意,此人谈论的是“完全卷积网络”而不是“完全连接网络”。在全卷积网络中,所有层都是卷积层,只要通道尺寸固定,卷积层就不会消耗任意大小(宽度和高度)的输入。
标准卷积网络需要固定输入大小,因为在将卷积输出馈送到全连接层之前进行了“扁平化”。所以如果你去掉全连接层(即全卷积网络),你就不会有这个问题。
它说的基本上与帖子 2 相同(在我看来)。总而言之,如果您的卷积网络有一个全连接层,并且您尝试输入可变大小的输入,您将得到一个RunTimeError. 但是如果你有一个卷积输出并且你输入一个7x7x512(hxwx 通道)输入你会得到一个(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]不会在此更改期间受到影响。
希望这是有道理的。