说我想使用Keras的Convolutional2D
函数来构建CNN,输入图片的大小是[224, 320, 3]
而不是[224, 224, 3]
吗?
我应该将图像保留为矩形格式还是将其缩放为方形?我试过把它们变成正方形,但是质量大大降低了+边缘有重要的数据。
如果我使用矩形输入图像构建它,它最终会打破这条线吗?
我还希望将解码器连接到CNN的末端,以相同的形状输出图像(基本上是带有矩形图像而非正方形的VAE)。
答案 0 :(得分:0)
简短的回答是。使用平方的主要原因之一是,如果高度和宽度高度完全相同,则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)
反面可以用来制作解码器