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

Dan*_*rke 5 convolution neural-network autoencoder conv-neural-network keras

假设我想使用 Keras 的Convolutional2D函数构建 CNN,输入图像可以是 size[224, 320, 3]而不是类似 的大小吗[224, 224, 3]

我应该将图像保留为矩形格式还是将其缩放为正方形?我尝试将它们制作成正方形,但质量大大下降+边缘周围有重要数据。

如果我用矩形输入图像构建它,它最终会破坏线路吗?

我还想在 CNN 的末端附加一个解码器,以输出相同形状的图像(本质上是带有矩形图像而不是正方形的 VAE)。

Pan*_*hin 1

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

简短的回答是肯定的。使用正方形的一大原因是,如果高度和宽度完全相同,则最大池化/步幅/填充的数学计算很容易。它只是让事情变得简单。对于 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 )
Run Code Online (Sandbox Code Playgroud)

输出是

(1, 7, 10, 32)
Run Code Online (Sandbox Code Playgroud)

反过来可以用来制作解码器