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

Keras中Conv2DTranspose运算逻辑解析:实例疑问求解

Conv2DTranspose 实验疑问解析

实验背景与问题

我是Keras/TensorFlow初学者,对Conv2DTranspose的基本作用有初步了解,但对其细节逻辑存在困惑。为此做了以下实验:

  • 输入:5×5矩阵,仅中心元素为1,其余为0
  • 卷积核:3×3,元素为1-9
  • 参数:步长(2,2),padding='same'

运行代码后,输出结果里卷积核右下角的9未出现,且1-8的位置和预期不符,以下是实验代码、输出及具体疑问:

实验代码

import numpy as np
import keras as keras 

X = np.asarray([[0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0],
                [0, 0, 1, 0, 0],
                [0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0]])
X = X.reshape((5, 5, 1))
model = keras.models.Sequential()
layer = keras.layers.Conv2DTranspose(1, (3,3), strides=(2,2), padding='same', input_shape=(5, 5, 1))
model.add(layer)
weights = [np.array([ [[[1]],[[2]],[[3]]],
                      [[[4]],[[5]],[[6]]],
                      [[[7]],[[8]],[[9]]]
                    ], dtype="float32"), 
           np.array([0.], dtype="float32")]
layer.set_weights(weights)
y = model.predict(X).reshape((10, 10))
print(y)

输出结果

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 2.]
 [4. 5. 7. 8. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

疑问点

  • 卷积核右下角的9未出现在输出结果中
  • 输出中1-8的位置与源矩阵中1的相对位置不符合预期

问题解析

1. 为什么卷积核元素9没有出现在输出里?

Conv2DTranspose(转置卷积)的核心逻辑是:先对输入特征图进行上采样填充,再执行正向卷积。当设置padding='same'和strides=(2,2)时,输出尺寸固定为输入尺寸×步长(即5×2=10),但这个过程中会因输入尺寸为奇数、步长为偶数的组合,产生不对称的边界截断。

你的输入仅中心(2,2)位置(0-based)为1,它在转置卷积中对应输出的一个2×2区域(输入坐标(x,y)对应输出的(2x,2y)到(2x+1,2y+1))。卷积核的右下角元素9对应卷积核索引(2,2),按照转置卷积的位置计算规则,它应该映射到输出的2×2 +2 =6行、2×2 +2=6列的位置,但由于padding='same'的不对称填充逻辑,这个位置超出了有效计算范围,因此9的贡献被直接丢弃。

2. 为什么1-8的位置和预期不符?

这主要和两个关键点有关:

(1)转置卷积的位置映射规则

转置卷积中,输入元素(i,j)与卷积核元素(k,l)相乘后,输出位置的计算公式为:
output_row = i×strides[0] + k - padding_top
output_col = j×strides[1] + l - padding_left

当输入尺寸为奇数、步长为偶数时,padding='same'会采用不对称填充(左右/上下填充量不同),导致计算出的输出位置出现偏移。比如你看到的元素1出现在(4,8),就是因为右侧填充量远大于左侧,列方向的位置计算被偏移。

(2)卷积核的维度顺序影响

TensorFlow中Conv2DTranspose的权重维度为(kernel_height, kernel_width, output_channels, input_channels),你定义的卷积核元素顺序是行优先,但转置卷积的计算本质是正向卷积权重的转置,这会导致卷积核元素的映射方向和直观预期相反,进一步加剧位置的偏移感。


验证建议

如果把输入改成4×4(偶数尺寸),或者将步长改为1,你会看到卷积核的所有元素都能正常出现在输出中,且位置符合直观预期,这也能反向验证上述结论。


内容的提问来源于stack exchange,提问作者Benedikt R.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:45:02