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

时间:2018-09-12 12:14:44

标签: python tensorflow keras autoencoder

在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)的形状?

1 个答案:

答案 0 :(得分:0)

问题在于高度尺寸(150)无法被8整除。

解决方案1 ​​: 它可能不是最佳解决方案,但是您可以在最后一个UpSampling2D层之后添加一个ZeroPadding2D层:

match = re.search("CThru=([^ ]+)", test)
if match:
    value = match.group(1)

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

解决方案2 :您也可以使用{{3}}填充输入图像以使其高度为152:

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

通过这种方式,高度尺寸可以被8整除。