Keras中如何用Deconvolution2D得到7x7尺寸128通道特征图?
解决Keras反卷积层输出尺寸不符的问题
首先咱们先理清问题根源:你用Deconvolution2D得到8x8而非目标7x7,是因为反卷积的输出尺寸计算和你设置的参数不匹配;而后续用3x3卷积border_mode='same'没变化,是因为same padding的核心作用就是保持输入输出尺寸一致,8x8输入自然还是输出8x8,这是预期行为。
下面给你两种可行的解决方案:
方案一:调整反卷积层参数,直接得到7x7特征图
反卷积的输出尺寸计算公式(针对旧版Keras的Deconvolution2D,channels_first格式)是:输出尺寸 = (输入尺寸 - 1) × stride + 核大小 - 2 × padding
你的输入是4x4,目标输出7x7,stride设为2的话,代入公式:7 = (4-1)×2 + 核大小 - 2×padding
化简得:核大小 - 2×padding = 1
基于这个等式,你可以调整核大小和padding:
- 如果想用3x3核:
3 - 2×1 =1,刚好符合,此时用border_mode='same'(padding=1)即可,代码如下:
d6 = Deconvolution2D(128, 3, 3, subsample=(2,2), activation='relu', init='uniform', output_shape=(None, 128, 7, 7), border_mode='same')(d5)
- 如果坚持用5x5核:
5 -2×2=1,但旧版Keras的border_mode没有直接支持自定义padding的选项,所以更推荐用3x3核的方案。
方案二:先反卷积得到8x8,再裁剪为7x7
如果你不想修改反卷积层的参数,可以用Cropping2D层把8x8的特征图裁剪成7x7,只需要裁掉一行一列即可:
# 先得到8x8的特征图 d6 = Deconvolution2D(128, 5, 5, subsample=(2,2), activation='relu', init='uniform', border_mode='same')(d5) # 裁剪为7x7 d6 = Cropping2D(cropping=((0, 1), (0, 1)))(d6)
这里cropping=((0,1),(0,1))表示在高度方向从底部裁掉1行,宽度方向从右侧裁掉1列(你也可以根据需求调整裁剪位置,比如上下各裁部分,但因为尺寸是整数,只能裁整行整列)。
另外提醒一下:旧版Keras的Deconvolution2D现在已经被Conv2DTranspose替代了,如果你用的是较新版本的Keras,建议迁移到Conv2DTranspose,参数逻辑基本一致,但更符合官方规范。
内容的提问来源于stack exchange,提问作者konstantin
相关产品推荐
相关产品推荐

