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

我阅读了多个相互矛盾的Stackoverflow帖子,我真的很困惑现实情况到底是什么样的。

我的问题如下。如果我在128x128x3大小的图像上训练了一个FCN,是否可以输入256x256x3大小的图像,或者B)128x128,或者C) 都不能,因为训练和测试时的输入必须相同?

考虑StackOverflow的帖子#1。在这篇文章中,它建议输入和输出的图像必须具有相同的尺寸。这对我来说是合理的。

StackOverflow的帖子#2:在这篇文章中,它建议我们在测试时可以输入不同大小的图像,如果你做了一些奇怪的压缩操作,这是可能的。我完全不确定这是如何可能的。

StackOverflow的帖子#3:在这篇文章中,它建议只需要深度相同,高度和宽度不需要相同。这是怎么可能的?

根据我的理解,底线是,如果我在128x128x3上进行了训练,那么从输入层到第一个卷积层,(1)会发生固定的步长数。因此,(2)有一个固定的特征图大小,并且相应地,(3)有一个固定的权重数量。如果我突然将输入图像大小更改为512x512x3,由于尺寸的差异,训练和测试的特征图根本无法比较,除非

  1. 当我输入512x512大小的图像时,只考虑顶部的128x128,忽略图像的其余部分
  2. 在将图像输入网络之前,先对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])在这种变化中不会受到影响。

enter image description here

希望这有意义。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注