我正在按照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个内核。
如果我删除Conv2D_6层,它将起作用。但是我想拥有它,否则我将进行两次UpSampling。我不明白怎么了。
有人可以指导我吗?
答案 0 :(得分:1)
您需要将padding='same'
添加到该层,因此它应类似于:
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
然后它将保持相同的尺寸。 没有它,您将不使用任何填充,并且由于您的内核是3×3,因此您的112 * 112会在该层之后转换为110 * 110。