预期conv2d_7的形状为(220,220,1),但数组的形状为(224,224,1)

时间:2019-02-09 19:23:05

标签: tensorflow keras autoencoder deconvolution max-pooling

我正在按照keras博客(https://blog.keras.io/building-autoencoders-in-keras.html)的教程来构建自动编码器。

我使用了自己的数据集,并且在224 * 224尺寸的图像上使用了以下代码。

input_img = Input(shape=(224,224,1)) # size of the input image
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 (4, 4, 8) i.e. 128-dimensional

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)
x = Conv2D(16, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

当我看到自动编码器的摘要时,它会提供输出,使得最后一层的分辨率为220 x220。我已附上该摘要的快照。

我不明白的是如何将其从转换为110 * 110 112 * 112。我期望conv2d_6(Conv2D)给我112 * 112的16个内核。

enter image description here

如果我删除Conv2D_6层,它将起作用。但是我想拥有它,否则我将进行两次UpSampling。我不明白怎么了。

有人可以指导我吗?

1 个答案:

答案 0 :(得分:1)

您需要将padding='same'添加到该层,因此它应类似于:

x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)

然后它将保持相同的尺寸。 没有它,您将不使用任何填充,并且由于您的内核是3×3,因此您的112 * 112会在该层之后转换为110 * 110。