具有动态输入形状的 CNN
Posted
技术标签:
【中文标题】具有动态输入形状的 CNN【英文标题】:CNN with a dynamic input shape 【发布时间】:2019-04-19 10:28:31 【问题描述】:大家好!
由于我正在尝试制作一个将灰度图像转换为 rgb 图像的全卷积神经网络,因此我想知道是否可以在不同尺寸的图像(不同的像素和比率)上训练和测试模型。通常你只会下采样或上采样,这是我不想做的。我听说如果我使用全卷积神经网络可能会实现,但我仍然不知道代码会是什么样子。你能帮我写一些代码吗?
为什么会出现这个问题?
就像我说的,输入图像不应该被下采样,因为我不分类任何东西。我想生成与输入图像大小相同的新图像。所以应该不会有任何损失。
固定输入形状的代码:
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
...
图片大小为 28*28px
我认为它可能如何工作:
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(None, None, 1)))
model.add(layers.MaxPooling2D((2, 2)))
...
不同尺寸的图片
图像1 = 256*300 图像2 = 1024*800 图像3 = 500*400Here 是一个将灰度图像转换为 rgb 图像的自动编码器示例,但这个具有固定的输入形状。
*我正在使用 TF 2.0 Alpha
【问题讨论】:
处理不同尺寸的技术:(1)裁剪/缩放和使用多个输入进行一个预测+组合结果(2)FCN(3)全局池化。详情请见Analysis and Optimization of Convolutional Neural Network Architectures。 您尝试了哪些方法,问题是什么?您上面描述的方法有效;只要确保您以后没有任何需要固定大小的层/步骤即可。通常,当您想要对东西进行实际分类时,您有一个固定的大小。因此,如果您没有非常特殊的损失函数/目标(例如,稍后上采样 + 与 FCN 论文中输入相同形状的目标),您可以结合 FCN+全局池。那你就开心了。 我的意思是我有一个特定的损失函数。我使用 GAN 酷 :-) 你能尽量减少你的代码并分享你面临的具体问题/你得到的错误信息吗? 我实际上并没有开始编写网络代码,因为我一直在努力寻找该应用程序的工作代码。但是我认为您的评论很有帮助,所以非常感谢您! 【参考方案1】:我发现,卷积神经网络根本不关心输入形状。它关心的是内核大小、步幅和填充。例如 settingkernel size = 3, stride = 1, padding = 1 不会改变张量的形状。谈到池化时,必须确保添加了 padding = 1,这称为 half/same padding (http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html)。因此,可以制作一个能够处理不同大小图像的全卷积自编码器。
【讨论】:
以上是关于具有动态输入形状的 CNN的主要内容,如果未能解决你的问题,请参考以下文章
根据输入形状的计算是不是存在差异? (带有 Tensorflow 的 Python 中的 CNN)
ValueError:检查输入时出错:预期 input_1 有 4 个维度,但得到的数组具有形状(无、无、无)
如何通过Elasticsearch 6.x中的动态或未知字段进行聚合