前言
转置卷积,可称为Transposed Convolution、fractionally-stride convolution、deconvolution。转置卷积的作用是上采样。
注意:
- 转置卷积不是卷积的逆运算。只是将特征层的大小还原回卷积之前的大小,但其数值和输入特征层的数值是不同的。
- 转置卷积也是卷积。
1. 运算步骤
- 在特征图元素间填充s-1行、列
- 在输入特征图四周填充k-p-1行、列
- 将卷积核参数上下、左右翻转
- 做正常卷积运算(填充0,步距1)
输出计算公式如下:
H o u t = ( H i n − 1 ) × s [ 0 ] − 2 × p [ 0 ] + k [ 0 ] H_{out} = (H_{in} - 1) \times s[0] - 2 \times p[0] + k[0] Hout=(Hin−1)×s[0]−2×p[0]+k[0]
W o u t = ( W i n − 1 ) × s [ 1 ] − 2 × p [ 1 ] + k [ 1 ] W_{out} = (W_{in} - 1) \times s[1] - 2 \times p[1] + k[1] Wout=(Win−1)×s[1]−2×p[1]+k[1]
2. 进一步理解
假设输入为 4 × 4 4 \times 4 4×4大小,使用 3 × 3 3 \times 3 3×3大小的卷积核进行卷积,步距为1, 填充为0,最终得到 2 × 2 2 \times 2 2×2大小的特征图。
之前所说的普通卷积的计算方式都是以一个滑动窗口的方式来进行计算,但是,在实际实现的过程中,这种方式是非常低效的。更为高效的方式是将卷积核构建为一个个与输入feature map同样大小的零矩阵,然后将卷积核的参数填入到零矩阵的对应位置,得到卷积核的等效矩阵。
接下来,将输入特征图进行展平,变成1行16列的矩阵 I I I。
再将构建的四个等效矩阵展开,都转化为一个列向量,得到16行4列的矩阵 C C C。
最后,将矩阵 I I I与矩阵 C C C相乘,得到矩阵 O O O。
考虑已知矩阵 C C C和矩阵 O O O,能否得到矩阵 I I I?换句话说,卷积是否可逆?
需要注意的是只有方阵才存在逆矩阵,而矩阵 C C C不是一个方阵,所以其不存在逆矩阵,因而卷积不可逆。
放宽条件,已知矩阵 C C C和矩阵 O O O,能否得到与矩阵 I I I同样大小的矩阵?
很明显是可以的,只需要在等号两边乘上 C T C^T CT即可。
这就是转置卷积的过程,实际就是一个上采样,通过一个 2 × 2 2 \times 2 2×2的特征图得到了一个 4 × 4 4 \times 4 4×4的特征图。
考虑一个逆过程,将 O O O和 C C C都写成一个 2 × 2 2 \times 2 2×2的等效矩阵的形式,对应位置相乘,即得到对应的 P P P的数值。
首先拿等效矩阵当中第一个等效矩阵与矩阵 O O O进行对应位置上的相乘再相加的操作,最终结果为0。右下角使用绿色的卷积核,对填充2列后的 O O O进行相乘,得到的结果也为0。依次使用每个等效矩阵与 O O O相乘,发现结果均与绿色卷积核与填充后的 O O O矩阵相乘结果一致。
可以发现,这个绿色的卷积核实际上就是最开始使用的卷积核进行了上下、左右翻转。