首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UpSampling不匹配时keras形状

UpSampling不匹配时keras形状
EN

Stack Overflow用户
提问于 2018-05-25 01:53:34
回答 3查看 1.7K关注 0票数 5

我正在尝试使用自己的数据运行这个convolutional auto encoder示例,所以我根据我的图像修改了它的InputLayer。然而,在输出层上,尺寸有一个问题。我确信问题出在UpSampling上,但我不确定为什么会发生这种情况:下面是代码。

代码语言:javascript
运行
复制
N, H, W = X_train.shape
input_img = Input(shape=(H,W,1))  # adapt this if using `channels_first` image data format

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')

autoencoder.summary()

然后,当我运行fit时,抛出这个错误:

代码语言:javascript
运行
复制
i+=1
autoencoder.fit(x_train, x_train,
            epochs=50,
            batch_size=128,
            shuffle=True,
            validation_data=(x_test, x_test),
            callbacks= [TensorBoard(log_dir='/tmp/autoencoder/{}'.format(i))])

ValueError: Error when checking target: expected conv2d_23 to have shape (148, 84, 1) but got array with shape (150, 81, 1)

我返回到教程代码,并尝试查看其模型的摘要,它显示了以下内容:

我肯定在解码器上重建输出时会有问题,但我不确定为什么,为什么它适用于128x28图像,而不适用于150x81的图像

我想我可以稍微改变我的图像的维度来解决这个问题,但我想了解发生了什么,以及如何避免它

EN

回答 3

Stack Overflow用户

发布于 2019-01-17 16:33:31

您可以使用ZeroPadding2D填充输入图像到32X32,然后使用Cropping2D裁剪解码图像。

代码语言:javascript
运行
复制
from keras.layers import ZeroPadding2D, Cropping2D


input_img = Input(shape=(28,28,1))  # adapt this if using `channels_first` image data format
input_img_padding = ZeroPadding2D((2,2))(input_img)  #zero padding image to shape 32X32
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img_padding)
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', padding='same')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
decoded_cropping = Cropping2D((2,2))(decoded)

autoencoder = Model(input_img, decoded_cropping) #cropping image from 32X32 to 28X28
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

autoencoder.summary()

票数 1
EN

Stack Overflow用户

发布于 2019-08-30 15:36:02

解码器的最后一层不使用任何填充。您可以通过将解码器中的最后一层更改为:

代码语言:javascript
运行
复制
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)

您将看到输出暗淡现在将与输入暗淡相匹配。

票数 0
EN

Stack Overflow用户

发布于 2021-12-21 17:37:05

这是您在处理解码器或某种形式的上采样时面临的典型问题。

但你可能没有意识到的是,上采样或反卷积通常会导致高度和宽度的增加,这可能会超过你预期的尺寸。

更准确地说,:

在你的例子中,你期望和输出的是shape (148, 84, 1),然而,由于上采样,你最终得到了(150, 81, 1)

这里的解决方案是在上采样后使用裁剪层裁剪输出:

代码语言:javascript
运行
复制
tf.keras.layers.Cropping2D(cropping=(top_crop, bottom_crop), (left_crop, right_crop)) 

因此,在您的示例中:

代码语言:javascript
运行
复制
tf.keras.layers.Cropping2D(cropping=(1, 1), (1, 2)) 
# or
tf.keras.layers.Cropping2D(cropping=(0, 2), (2, 1)) 
# or 
tf.keras.layers.Cropping2D(cropping=(2, 0), (1, 2)) 

这将把输出从(150,81,1)裁剪到预期的形状(148,84,1)。

欲了解更多详情,请访问:tf.keras.layers.Cropping2D

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50515409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档