期望 conv2d_7 具有形状 (220, 220, 1) 但得到形状为 (224, 224, 1) 的数组
expected conv2d_7 to have shape (220, 220, 1) but got array with shape (224, 224, 1)
我正在按照 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 x 220。我附上了该摘要的快照。
我不明白的是它是如何从
112*112。我期待 conv2d_6 (Conv2D) 给我 112*112 和 16 个内核。
如果我删除 Conv2D_6 层,那么它将起作用。但我想拥有它,否则我将进行两次上采样。我不明白这是怎么回事。
有人可以指导我吗?
您需要将 padding='same'
添加到该层,因此它应该如下所示:
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
然后它将保持相同的尺寸。
没有它你不使用任何填充,因为你的内核是 3×3,你的 112*112 在该层之后转换为 110*110。
我正在按照 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 x 220。我附上了该摘要的快照。
我不明白的是它是如何从 112*112。我期待 conv2d_6 (Conv2D) 给我 112*112 和 16 个内核。
如果我删除 Conv2D_6 层,那么它将起作用。但我想拥有它,否则我将进行两次上采样。我不明白这是怎么回事。
有人可以指导我吗?
您需要将 padding='same'
添加到该层,因此它应该如下所示:
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
然后它将保持相同的尺寸。 没有它你不使用任何填充,因为你的内核是 3×3,你的 112*112 在该层之后转换为 110*110。