转置卷积(Transposed Convolution)
转置卷积(Transpose Convolution),一些地方也称为“反卷积”,在深度学习中表示为卷积的一个逆向过程,可以根据卷积核大小和输出的大小,恢复卷积前的图像尺寸,而不是恢复原始值。1 卷积操作及转置卷积的定义1.1 卷积操作对于一个输入大小为 的图像,卷积核大小为:计算输出的具体实现方法为矩阵乘法。将卷积核表示为稀疏矩阵每一行向量表示在一个位置的卷积操作,0填充表示...
目录
2.2.1 一维形式
转置卷积(Transpose Convolution),一些地方也称为“反卷积”,在深度学习中表示为卷积的一个逆向过程,可以根据卷积核大小和输出的大小,恢复卷积前的图像尺寸,而不是恢复原始值。
1 卷积操作及转置卷积的定义
1.1 卷积操作
对于一个输入大小为 的图像,卷积核大小为 :
计算输出 的具体实现方法为矩阵乘法。
将卷积核表示为稀疏矩阵
每一行向量表示在一个位置的卷积操作,0填充表示卷积核未覆盖到的区域。
将输入 展开为列向量:
则卷积操作可以表示为:
输出向量 的大小为 的列向量,改写为矩阵即为 。
1.2 转置卷积
现在,考虑一下我们如何换一个计算方向。也就是说,我们想要建立在一个矩阵中的1个值和另外一个矩阵中的9个值的关系。这就是像在进行卷积的逆向操作,这就是转置卷积的核心思想。
(译者注:从信息论的角度看,卷积是不可逆的。所以这里说的并不是从output矩阵和kernel矩阵计算出原始的input矩阵。而是计算出一个保持了位置性关系的矩阵。)
转置卷积则是将 中的输入输出互换:
- 表示矩阵转置,此时大小为 。
- 即由 的输入 ,经过转置卷积,得到输出大小为 的列向量 ,此时的 数值上已经和原来不同,只是在形状上一致。
1.3 转置卷积的步骤
示例:
卷积的计算方式:
转置矩阵的计算步骤:
2 转置卷积的理解
2.1 stride=1转置卷积的理解
2.1.1 一维形式
这样能得到和转置卷积相同的结果。其实就是为转置卷积的输入 添加额外的padding,而卷积核则是镜像翻转的。这里仍然是比较元素位置关系的对应,不考虑数值。
这样的理解有什么用呢?
由于转置卷积的卷积核也是可learning的,在给定了输入和卷积核的大小后,我们可以将转置卷积看做是有padding的普通卷积。也就是说,所谓的转置卷积,等价于普通卷积,无非是padding较大时,可以达到上采样的效果。
2.1.2 二维形式
2.1.3 公式计算
对于的普通卷积,等价的转置卷积的输出大小为:。同时要求转置卷积的输入添加。即转置卷积实现输出变大是卷积核的影响。
2.2 stride>1转置卷积的理解
2.2.1 一维形式
2.2.2 二维形式
同样等价于输入添加空洞,额外padding,卷积核水平竖直翻转的普通卷积:
2.2.3 公式计算
下图展示了转置卷积中不同s和p的情况:
s=1, p=0, k=3 | s=2, p=0, k=3 | s=2, p=1, k=3 |
3 总结
转置卷积和普通卷积有相同的本质: 建立了一些值之间的关系。 只不过,转置卷积所建立的这个关系与普通卷积所建立的关系,方向相反。
我们可以使用转置卷积来进行上采样。并且,转置卷积中的权重是可以被学习的。因此,我们没有必要搞什么插值方法来做上采样。
尽管它被称作转置卷积, 但是这并不意味着我们是拿一个已有的卷积矩阵的转置来作为权重矩阵的来进行转置卷积操作的。和普通卷积相比,intput和output的关系被反向处理(转置卷积是1对多,而不是普通的多对1),才是转置卷积的本质.
正因如此,严格来说转置卷积其实并不算卷积。但是我们可以把input矩阵中的某些位置填上0并进行普通卷积来获得和转置卷积相同的output矩阵。 你可以发现有一大把文章说明如何使用这种方法实现转置卷积。 然而, 因为需要在卷积操作之前,往input中填上许多的0,这种方法其实有点效率问题。
警告:转置卷积会在生成的图像中造成棋盘效应(checkerboard artifacts).。本文推荐在使用转置卷积进行上采样操作之后再过一个普通的卷积来减轻此类问题。如果你主要关心如何生成没有棋盘效应的图像,需要读一读paper。
转置卷积(Transpose Convolution) - 知乎
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)