在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)
对于层的设置以及我只能为层MaxPooling2D
和UpSampling2D
使用大小的整数这一事实不足为奇。但是我该如何处理呢?
如何恢复为(150, 360, 3)
的形状?
答案 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整除。