You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:50:14