假设我想使用 Keras 的Convolutional2D
函数来构建 CNN,输入图像的大小是否可以[224, 320, 3]
而不是类似[224, 224, 3]
?
我应该将图像保留为矩形格式还是将其缩放为正方形?我尝试将它们制作成正方形,但质量大大降低 + 边缘周围有重要数据。
如果我用矩形输入图像构建它,它最终会分解线条吗?
我还想在CNN的末端附加一个解码器,以输出相同形状的图像(本质上是带有矩形图像而不是正方形图像的VAE(。
我可以在任意矩形上使用 Conv2D 吗?
简短的回答是肯定的。 使用正方形的一个重要原因是,如果高度和宽度完全相同,则最大池/跨步/填充的数学很容易。 它只是让它变得容易。 在 224 的情况下,您可以使用 conv2d 和 padding=same,然后是 maxpool 几次,将高度和宽度从 224 减少到 112,然后是 56、28、14,最后是 7。
当您使用 224x320 的输入图像执行此操作时,缩减的进度如下:224x320、112x160、56x80、28x40、14x20、7x10。 没什么大不了的,而且效果很好。 相反,如果图像是224x300,那么在第二维度不能很好地划分之前,它就不会走得太远。
这是 tensorflow 中的一些代码,用于自动编码器的编码器端
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)
反之则可用于制作解码器