Keras中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_topoutput_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.

