转置卷积 Transposed Convolution
在我学转置卷积的时候,csdn上很多人没有讲清楚,其实很简单,这篇文章让你五分钟明白什么是转置卷积。
转置卷积的直观计算
卷积不会增大输入的高和宽,通常要么不变,要么减半。而转置卷积则可以用来增大输入高宽。
转置卷积也是一种卷积
计算机可以用计算“卷积”的方式来计算“转置卷积”,假设s为步长,p为单侧padding长度,k为kernel边长
- 在行和列之间插入 s − 1行和列(内填充)
- 外填充 k − p − 1
- 将核矩阵上下、左右翻转
- 然后做正常卷积(填充 0、步幅 1)
大小关系
设转置卷积前的矩阵边长为n0,转置卷积后的为n1,则有:
n
1
=
(
n
0
−
1
)
s
+
k
−
2
p
n_1=(n_0-1)s+k-2p
n1=(n0−1)s+k−2p
如若将转置卷积后的矩阵n1经过转置变为n0,则有:
n
0
=
⌊
(
n
1
+
2
p
−
k
)
/
s
⌋
+
1
n_0=\lfloor(n_1+2p-k)/s\rfloor +1
n0=⌊(n1+2p−k)/s⌋+1
可见由于卷积的性质,有“下取整”的存在,会导致多个n1对应到同一个n0,这也就说明,当我们做转置卷积时,由n0计算得到的n1是所有【经过卷积得到n0的n1中,最小的那个(也就是能整除的那个)】。所以当我们计算转置卷积时,需要加入out padding,来修正得到的n1以达到我们想要的输出大小。
在Pytorch中,修正后的公式为:
n
1
=
(
n
0
−
1
)
s
+
k
−
2
p
+
O
u
t
p
u
t
P
a
d
d
i
n
g
n_1=(n_0-1)s+k-2p+OutputPadding
n1=(n0−1)s+k−2p+OutputPadding
这里的output-padding不乘2,是为了“细致修改”,如果乘2,那就每次加偶数个填充了,依然会有取不到的n1值