转置卷积(Transpose Convolution),一些地方也称为“反卷积”,在深度学习中表示为卷积的一个逆向过程,可以根据卷积核大小和输出的大小,恢复卷积前的图像尺寸,而不是恢复原始值。
卷积操作及转置卷积的定义
对于一个输入大小为
计算输出
将卷积核表示为稀疏矩阵
- 每一行向量表示在一个位置的卷积操作,0填充表示卷积核未覆盖到的区域。
将输入
则卷积操作可以表示为:
- 输出向量
的大小为的列向量,改写为矩阵即为。
转置卷积则是将
-
表示矩阵转置,此时大小为。
- 即由
的输入,经过转置卷积,得到输出大小为的列向量,此时的数值上已经和原来不同,只是在形状上一致。
stride=1转置卷积的理解
一维形式
对于输入
设
考虑一个新的卷积过程,令stride=1:
这样能得到和转置卷积相同的结果。其实就是为转置卷积的输入
这样的理解有什么用呢?
由于转置卷积的卷积核也是可learning的,在给定了输入和卷积核的大小后,我们可以将转置卷积看做是有padding的普通卷积。也就是说,所谓的转置卷积,等价于普通卷积,无非是padding较大时,可以达到上采样的效果。
二维形式
考虑上文二维卷积的矩阵
令转置卷积输入
则转置卷积结果:
这等价于输入padding = 1的输入
和水平和竖直方向镜像翻转的卷积核
之间进行普通卷积的结果。
对应于下面的图像(这里的卷积核大小和举例不一样):
公式计算
对于
- 即转置卷积实现输出变大是卷积核的影响。
转置卷积的输入图像如果再添加额外的padding,可以看做无padding的图像来计算,即先按上面的公式计算出有padding的输入图像大小
此时,相当于减小了输入的padding,有
相当于进行了一个center crop,卷积核和输入图像起始时非零元素的范围大于1×1:
stride>1转置卷积的理解
一维形式
对于输入
设
考虑一个新的卷积过程,令stride=1:
和转置卷积是等价的。
此时输入
二维形式
对于输入为
设卷积核为
转置卷积时,设输入
同样等价于输入添加空洞,额外padding,卷积核水平竖直翻转的普通卷积:
对应的gif图像:
公式计算
对于
转置卷积的输入图像需要添加
- 参数
显得很重要,可以控制上采样的倍率。
简单推导:
添加空洞后的图像大小为
同样地,padding大于0时,有:
总结
实际使用时,stride>1的情况比较多,可以得到较大的上采样倍率,padding个人觉得没必要仔细研究,先转置卷积得到一个大分辨率的图像,再通过center crop,同样可以精确地恢复尺寸。
参考
- A guide to convolution arithmetic for deep learning
- https://zhuanlan.zhihu.com/p/48501100
- https://github.com/vdumoulin/conv_arithmetic