本文总结Pytorch中用转置卷积还原卷积过程的参数设置。
直接上栗子,卷积过程:
5×5输入特征图,步长
s
=
2
s=2
s=2,卷积核
k
=
3
k=3
k=3,填充
p
=
1
p=1
p=1。
输出特征图为 5 − k + 2 p s + 1 = 3 \displaystyle \frac{5-k+2p}{s}+1=3 s5−k+2p+1=3。
转置卷积过程如上图:
- 3×3特征图内部填充:相邻2行/列间插入 s − 1 s-1 s−1行/列0值
- 3×3特征图外部填充: p a d d i n g = k − p − 1 padding=k-p-1 padding=k−p−1。
- 卷积核同 k k k,步长始终为1。
注:图像转置卷积的方法并不止一种,上述解释只适用于大部分常见情况。
看一下Pytorch中转置卷积nn.ConvTranspose2d()的主要参数:
in_channels: int,
out_channels: int,
kernel_size: _size_2_t,
stride: _size_2_t = 1,
padding: _size_2_t = 0,
output_padding: _size_2_t = 0,
注意:参数kernel_size,padding,stride指的都不是转置卷积中的,而是卷积过程的,转置卷积中的填充不需要自己算,Pytorch帮我们解决了……也就是说这3个参数,卷积的时候填啥,转置卷积就填啥,开心~
最后解释一下参数output_padding。在栗子中,如果将输入特征图尺寸改为6×6,根据公式,输出依然为3×3,不够步长的最后1行/列会被舍弃。这样的话,转置卷积依然得到5×5就没有达到还原的目的,也无法一一对应。
因此,参数output_padding=1的含义就是在扩张3×3特征图时,再加上1行1列的填充。
总
之
\color{red}{总之}
总之,卷积计算公式中出现向下取整的情况,就需要设定output_padding=卷积时舍弃的行/列数。
牛刀小试:
4×4输入特征图,步长
s
=
1
s=1
s=1,卷积核
k
=
3
k=3
k=3,填充
p
=
0
p=0
p=0。
输出特征图为
4
−
k
+
2
p
s
+
1
=
2
\displaystyle \frac{4-k+2p}{s}+1=2
s4−k+2p+1=2。
那么转置卷积时,2×2特征图内部填充为
s
−
1
=
0
s-1=0
s−1=0,外部填充为
k
−
p
−
1
=
2
k-p-1=2
k−p−1=2,卷积时没有向下取整,参数output_padding=0。