Keras:正确指定输出的形状(对于卷积自动编码器)



在Keras中,我有模型

input_img = Input(shape=(150, 360, 3))
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)
# at this point the representation is autoencoder.layers[6].output_shape = (None, 19, 45, 8)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)                                      #10
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)                                     
decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

最终形状为

autoencoder.layers[13].output_shape
(None, 152, 360, 3)

从图层的设置以及我只能使用整数作为图层大小的事实来看,这并不奇怪MaxPooling2DUpSampling2D.但是我该如何处理呢?

如何恢复(150, 360, 3)的形状?

问题是高度维度 (150( 不能被 8 整除。

解决方案 1: 这可能不是最好的解决方案,但您可以在最后一个 UpSampling2D 图层之后添加一个裁剪 2D 图层:

x = UpSampling2D((2, 2))(x)
x = Cropping2D(cropping=(1, 0))(x)
decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)

通过使用此操作,您基本上告诉模型忽略最后一个UpSampling2D输出的第一行和最后一行。

解决方案 2:您还可以使用 ZeroPadding2D 填充输入图像,使其高度为 152:

input_img = Input(shape=(150, 360, 3))
x = ZeroPadding2D(padding=(1, 0))(input_img)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)

这样,高度维度可以被 8 整除。

最新更新