【AI数学】反卷积(deconvolution)

前言

卷积操作是图像处理中最常见的计算之一了,我们知道卷积可以除了可以提取图像特征之外,最大的作用之一就是降维(这里的维度是指数据的维度,不是指图像的维度)。比如,我们把卷积的步长设置为(2,2),那么卷积操作会使得输出特征图尺寸变为输入特征图尺寸的四分之一。

反卷积和卷积相反,可以进行升维操作。目前,分割算法,生成算法等都要用到升维操作,这便导致了反卷积的使用越来越多。

这里最直观的例子就是自动编码器,编码过程就是一个降维过程,这一过程可以由卷积实现。解码过程相当于升维过程,这一过程可以用反卷积实现。


卷积与反卷积

                                                                                      图1 卷积操作 

上图是用一个3x3的kernel来卷积4x4的feature,最后的输出是2x2。这就是卷积最基本的操作,我们知道卷积还有其他参数需要说明,比如:步长多大,padding为几等等。我们先就以最简单的步长为1,padding为valid(即0)来讨论。对于这么一个卷积过程的反卷积操作如下:

                                                                        图2 反卷积操作 

成功的通过反卷积的操作将2x2的feature还原成了4x4的feature。从直观上来看,卷积和反卷积可以看作尺寸上的反变换。 我们可以看到,反卷积也是一种特殊的卷积。

我们常见的卷积模式有三种:valid, same, full.详情可见文章《卷积的三种模式》。

其实这里会有一个明显的误导信息,很容易将反卷积理解成full模式的卷积。事实上是有差别的,反卷积并非等价于full模式的卷积。意思是,卷积核参数的位置并非相同。

反卷积有叫做transposed convolution,即转置卷积。我们从数学的角度来看,这个转置体现在哪里。

现在开始说明:A为原图,即4x4大小。C为卷积核,即3x3大小。B为输出feature,即2x2大小。对应上图。

第一步,将4x4的A拉直,变成16x1的向量A`。

第二步,把3x3的C拉直,放到16x1的全零向量里面,对应位置改成权值。那么C变成了,含有9个权值和7个0构成的16x1向量。

那么每次卷积操作都对应两个16x1的向量的点乘。我们看C的转置:

C变成了一个4x16的矩阵,每个长度为16的列和A`进行点乘就是一次卷积,输出一个值。对于卷积的公式:

                                                                        C\cdot A = B

用矩阵乘法的知识可以知道,(4, 16)乘以(16, 1)的输出为(4,1)。

我们如果进行反卷积,可以看公式:

                                                                          C^{T}\cdot B = A

C的转置是16x4,B是4x1,相乘得到的结果就是16x1。

所以,反卷积的转置体现在了这里。


步长大于1的情况 

步长大于1的情况在反卷积的用法里占大多数情况。因为卷积的步长可以对特征图进行尺寸变换,尺寸变换就相当于压缩解压操作。对于卷积,

对于反卷积:

反卷积其实还有另外一个名字,叫做 Fractionally Strided Convolution, 碎步卷积。小碎步跺起来。

把输入稀疏化以后,相当于原来的卷积步长小于1。就相当于一个碎步。


总结 

严格来讲,反卷积和卷积之间有参数对应关系。不过现在对反卷积的广义用法,其实早已脱离了反卷积的定义限制了。现在的反卷积,尤其是出现在自编码器等的反卷积,就是对卷积的高端用法而已,无须考虑和卷积参数位置有对应。

参考:https://github.com/vdumoulin/conv_arithmetic

参考:https://buptldy.github.io/2016/10/29/2016-10-29-deconv/

参考:https://blog.csdn.net/panglinzhuo/article/details/75207855

猜你喜欢

转载自blog.csdn.net/leviopku/article/details/83503274
今日推荐