我可以在Keras中使用带卷积神经网络的矩形图像吗?

时间:2018-05-26 07:50:30

标签: neural-network keras convolution autoencoder convolutional-neural-network

说我想使用Keras的Convolutional2D函数来构建CNN,输入图片的大小是[224, 320, 3]而不是[224, 224, 3]吗?

我应该将图像保留为矩形格式还是将其缩放为方形?我试过把它们变成正方形,但是质量大大降低了+边缘有重要的数据。

如果我使用矩形输入图像构建它,它最终会打破这条线吗?

我还希望将解码器连接到CNN的末端,以相同的形状输出图像(基本上是带有矩形图像而非正方形的VAE)。

1 个答案:

答案 0 :(得分:0)

我可以在任意矩形上使用Conv2D吗?

简短的回答是。使用平方的主要原因之一是,如果高度和宽度高度完全相同,则maxpooling / stride / padding的数学运算很容易。这很容易。在224的情况下,您可以使用conv2d和padding = same,然后多次使用maxpool将高度和宽度从224减小到112,然后将56、28、14减小到7。

使用224x320的输入图像执行此操作时,缩小的进度如下:224x320、112x160、56x80、28x40、14x20、7x10。没什么大不了的,而且效果很好。相反,如果图像为224x300,则第二维不能很好地划分之前就不会太远。

这是自动编码器的编码器端张量流中的一些代码

import tensorflow as tf
import numpy as np

encoder = tf.keras.models.Sequential([
    tf.keras.layers.InputLayer([224,320,3]),
    tf.keras.layers.Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'),
    tf.keras.layers.MaxPool2D(2),
    tf.keras.layers.Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'),
    tf.keras.layers.MaxPool2D(2),
    tf.keras.layers.Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'),
    tf.keras.layers.MaxPool2D(2),
    tf.keras.layers.Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'),
    tf.keras.layers.MaxPool2D(2),
    tf.keras.layers.Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'),
    tf.keras.layers.MaxPool2D(2),
    tf.keras.layers.Conv2D(filters=32, kernel_size=5, padding='same', activation='tanh'),
    ])

data = np.zeros([1,224,320,3], dtype=np.float32)
print( encoder.predict(data).shape )

输出为

(1, 7, 10, 32)

反面可以用来制作解码器