理解PyTorch中Conv2DTranspose的实现:带stride与padding的运算疑问
PyTorch ConvTranspose2d 运算逻辑解释
核心运算规则
带stride和padding的转置卷积可以简化为如下计算逻辑:
每个输入特征图上的点(x,y),会将指定大小的卷积核完整映射到输出特征图上,映射的卷积核左上角坐标为(x * stride - padding, y * stride - padding),输出特征图每个位置的最终值,是所有覆盖到该位置的卷积核元素的和。
本次示例参数:
- 输入为4x4全1张量,坐标范围
x∈[0,3], y∈[0,3] - 卷积核大小4x4,坐标范围
k_i∈[0,3], k_j∈[0,3],数值如下:[[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12], [13, 14, 15, 16]] - stride=2,padding=1,无bias
输出位置数值计算示例
输出(0,0)位置的6
仅输入点(0,0)对应的卷积核会覆盖输出(0,0):
- 输入点
(0,0)对应的卷积核左上角坐标为(0*2 -1, 0*2 -1) = (-1, -1) - 输出(0,0)对应卷积核的索引为
(0 - (-1), 0 - (-1)) = (1, 1) - 卷积核(1,1)位置的数值为6,无其他输入点贡献,因此该位置输出为6。
输出(0,1)位置的12
共有两个输入点的卷积核覆盖该位置:
- 输入点
(0,0):对应卷积核左上角(-1,-1),输出(0,1)对应卷积核索引(1,2),数值为7 - 输入点
(0,1):对应卷积核左上角(0*2 -1, 1*2 -1) = (-1, 1),输出(0,1)对应卷积核索引(1,0),数值为5
两者相加7+5=12,和输出结果一致。
所有输出位置的数值都可以按照上述规则计算得到,比如输出(0,2)的14,就是输入(0,0)对应卷积核(1,3)的8,加上输入(0,1)对应卷积核(1,1)的6,总和为14,和结果完全匹配。
内容的提问来源于stack exchange,提问作者IntegrateThis
相关产品推荐
相关产品推荐

