反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,可是并无指定反卷积这个名字,反卷积这个术语正式的使用是在其以后的工做中(Adaptive deconvolutional networks for mid and high level feature learning)。随着反卷积在神经网络可视化上的成功应用,其被愈来愈多的工做所采纳好比:场景分割、生成模型等。其中反卷积(Deconvolution)也有不少其余的叫法,好比:Transposed Convolution,Fractional Strided Convolution等等。
这篇文章的目的主要有两方面:
1. 解释卷积层和反卷积层之间的关系;
2. 弄清楚反卷积层输入特征大小和输出特征大小之间的关系。
## 卷积层
卷积层你们应该都很熟悉了,为了方便说明,定义以下:
- 二维的离散卷积(N=2)
- 方形的特征输入(i1=i2=i)
- 方形的卷积核尺寸(k1=k2=k)
- 每一个维度相同的步长(s1=s2=s)
- 每一个维度相同的padding (p1=p2=p)
下图表示参数为 (i=5,k=3,s=2,p=1) 的卷积计算过程,从计算结果能够看出输出特征的尺寸为 (o1=o2=o=3)。git
下图表示参数为 (i=6,k=3,s=2,p=1) 的卷积计算过程,从计算结果能够看出输出特征的尺寸为 (o1=o2=o=3)。github
从上述两个例子咱们能够总结出卷积层输入特征与输出特征尺寸和卷积核参数的关系为:
o=⌊i+2p−ks⌋+1.网络
其中 ⌊x⌋ 表示对 x 向下取整。框架
在介绍反卷积以前,咱们先来看看卷积运算和矩阵运算之间的关系。ide
考虑以下一个简单的卷积层运算,其参数为 (i=4,k=3,s=1,p=0),输出 o=2。学习
对于上述卷积运算,咱们把上图所示的3×3卷积核展成一个以下所示的[4,16]的稀疏矩阵 C, 其中非0元素 wi,j 表示卷积核的第 i 行和第 j 列。spa
咱们再把4×4的输入特征展成[16,1]的矩阵 X,那么 Y=CX 则是一个[4,1]的输出特征矩阵,把它从新排列2×2的输出特征就获得最终的结果,从上述分析能够看出卷积层的计算实际上是能够转化成矩阵相乘的。值得注意的是,在一些深度学习网络的开源框架中并非经过这种这个转换方法来计算卷积的,由于这个转换会存在不少无用的0乘操做,Caffe中具体实现卷积计算的方法可参考Implementing convolution as a matrix multiplication。翻译
经过上述的分析,咱们已经知道卷积层的前向操做能够表示为和矩阵C相乘,那么 咱们很容易获得卷积层的反向传播就是和C的转置相乘。ip
全面咱们已经说过反卷积又被称为Transposed(转置) Convolution,咱们能够看出其实卷积层的前向传播过程就是反卷积层的反向传播过程,卷积层的反向传播过程就是反卷积层的前向传播过程。由于卷积层的前向反向计算分别为乘 C 和 CT,而反卷积层的前向反向计算分别为乘 CT 和 (CT)T ,因此它们的前向传播和反向传播恰好交换过来。get
下图表示一个和上图卷积计算对应的反卷积操做,其中他们的输入输出关系正好相反。若是不考虑通道以卷积运算的反向运算来计算反卷积运算的话,咱们还能够经过离散卷积的方法来求反卷积(这里只是为了说明,实际工做中不会这么作)。
一样为了说明,定义反卷积操做参数以下:
下图表示的是参数为( i′=2,k′=3,s′=1,p′=2)的反卷积操做,其对应的卷积操做参数为 (i=4,k=3,s=1,p=0)。咱们能够发现对应的卷积和非卷积操做其 (k=k′,s=s′),可是反卷积却多了p′=2。经过对比咱们能够发现卷积层中左上角的输入只对左上角的输出有贡献,因此反卷积层会出现 p′=k−p−1=2。经过示意图,咱们能够发现,反卷积层的输入输出在 s=s′=1 的状况下关系为:
o′=i′−k′+2p′+1=i′+(k−1)−2p
上面也提到过反卷积有时候也被叫作Fractionally Strided Convolution,翻译过来大概意思就是小数步长的卷积。对于步长 s>1的卷积,咱们可能会想到其对应的反卷积步长 s′<1。 以下图所示为一个参数为 i=5,k=3,s=2,p=1的卷积操做(就是第一张图所演示的)所对应的反卷积操做。对于反卷积操做的小数步长咱们能够理解为:在其输入特征单元之间插入 s−1 个0,插入0后把其看出是新的特征输入,而后此时步长 s′ 再也不是小数而是为1。所以,结合上面所获得的结论,咱们能够得出Fractionally Strided Convolution的输入输出关系为:
o′=s(i′−1)+k−2p
Is the deconvolution layer the same as a convolutional layer?
转载至:http://buptldy.github.io/2016/10/29/2016-10-29-deconv/
更多关于卷积和反卷积的可视化理解:https://github.com/vdumoulin/conv_arithmetic