【神经网络与深度学习】卷积与反卷积

这里写图片描述 

1. 卷积与反卷积

如上图演示了卷积核反卷积的过程,定义输入矩阵为  I 4×4 ),卷积核为  K 3×3 ),输出矩阵为  O 2×2 ):css

  • 卷积的过程为: Conv(I,W)=O
  • 反卷积的过称为: Deconv(W,O)=I (须要对此时的  O  的边缘进行延拓 padding

2. 步长与重叠

卷积核移动的步长(stride)小于卷积核的边长(通常为正方行)时,变会出现卷积核与原始输入矩阵做用范围在区域上的重叠(overlap),卷积核移动的步长(stride)与卷积核的边长相一致时,不会出现重叠现象。html

4×4  的输入矩阵  I 和  3×3  的卷积核 K git

  • 在步长(stride)为 1 时,输出的大小为  (43+1)×(43+1)

现考虑其逆问题,原始输入矩阵为多大时,其与  3×3  的卷积核 K  相卷积获得的输出矩阵的大小为  4×4 github

  • 步长(stride)为 1 时, (x3+1)×(x3+1)=4×4  
    • x=6

搞明白了卷积网络中所谓deconv究竟是个什么东西后,不写下来怕又忘记,根据参考资料,加上我本身的理解,记录在这篇博客里。c#

先来规范表达

  • 为了方便理解,本文出现的举例状况都是2D矩阵卷积,卷积输入和核形状都为正方形,x和y轴方向的padding相同,stride也相同。
  • 记号: 
     i,o,k,p,s  分别表示:卷积/反卷积的输入大小  input size ,卷积/反卷积输出大小  output size ,卷积/反卷积核大小  kernel size  padding  stride  。
  • 举例(以下左图): 
    输入  XR(4,4) 矩阵,卷积核  wR(3,3)padding=0stride=1 的状况下,卷积的输出  YR(2,2) ,就记为  i=4,o=2,k=3,p=0,s=1  。

推翻错误的理解

第一次看到deconv这个词,觉得deconv的结果就是卷积的逆,以为神奇,不由产生了“哦?转置的卷积就能够求逆了吗?”这样的想法,而后在matlab里面实验求证,我还记得当时觉得反卷积可以求逆,考虑到图片进行常规卷积操做输出大小又不可能变大(same/valid),因而我还假设反卷积输出大小不变,用了same padding和原核的转置做为反卷积配置,结果发现根本不是那么一回事好吗。 
其实DL中的deconv,是一种上采样过程,举个比方:输入  XR(4,4) 矩阵,卷积核  wR(3,3)pad=0stride=1 的状况下(以下左图),卷积的输出  YR(2,2) 。对  Y 进行deconv,它只能作到把还原输出大小到和  X 同样大,输出值和  X 有那么一点联系。 
因此啊deconv这个名字至关误导人呐!这在cs231n课程里也被吐槽过,你们如今更喜欢用transposed conv来表述反卷积。为了方便起见,后文就用反卷积这个词了。网络

第二个容易confused的地方,就是不少文章都说卷积核的转置就能够求反卷积,又陷入迷茫“就算把卷积核转置(或者左右翻转上下翻转),卷积后输出仍是愈来愈小(或不变,至少不会增大)啊”……直到看到文献和相应的这个动画(其余动画在github-convolution arithmetic1框架

卷积 $\ padding=0,stride=1$ 反卷积$\ padding=0,stride=1$
卷积   i=4,k=3,p=0,s=1, o=2 反卷积  i=2,k=3,p=0,s=1, o=4

注意图中蓝色(下面)是输入,绿色(上面)是输出,卷积和反卷积在  psk  等参数同样时,是至关于  i  和  o  调了个位。 
这里说明了反卷积的时候,是有补0的,即便人家管这叫no padding  p=0 ),这是由于卷积的时候从蓝色  4×4  缩小为绿色  2×2 ,因此对应的  p=0  反卷积应该从蓝色  2×2  扩展成绿色  4×4 。并且转置并非指这个  3×3  的核  w  变为  wT ,但若是将卷积计算写成矩阵乘法(在程序中,为了提升卷积操做的效率,就能够这么干,好比tensorflow中就是这种实现),  Y⃗ =CX⃗  (其中  Y⃗   表示将  Y⃗   拉成一维向量,  X⃗   同理),那么反卷积确实能够表示为  CTY⃗  ,而这样的矩阵乘法,偏偏等于  w  左右翻转再上下翻转后与补0的  Y  卷积的状况。ide

而后就产生了第三个confuse:“补0了会不会有影响,还能经过反卷积近似输入  X  吗?”其实反卷积也不必定能达到近似的效果,图像里的卷积,至关于一种相关操做,而反卷积维持了这种相关操做时的  w  与  X 、与  Y  之间的联系维持了。至于补0后操做是否还等价,上一段已经说明了是等价的,读者能够在阅读完后面的文章后本身尝试一下。post


反卷积以及反向传播的过程

卷积和反卷积的过程在arXiv-A guide to convolution arithmetic for deep learning2写的很是详细,还有不少例子便于理解,在这里我就截图出重点来(ps.文中的figure2.1就是上图的左边)。剩下的例子请你们多看看原文,最好本身动手算一下,我也贴个我算的过程(  Ci  表示矩阵  C  的第  i  行),供参考。 
关于反向传播, 知乎-如何理解深度学习中的deconvolution networks3有详细的推导过程。 
这里写图片描述 
这里写图片描述
这里写图片描述 
这里写图片描述 
这里写图片描述学习


参考资料

Transposed Convolution, Fractionally Strided Convolution or Deconvolution






反卷积(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 N=2
- 方形的特征输入( i1=i2=i i1=i2=i
- 方形的卷积核尺寸( k1=k2=k k1=k2=k
- 每一个维度相同的步长( s1=s2=s s1=s2=s
- 每一个维度相同的padding ( p1=p2=p p1=p2=p)

下图表示参数为  (i=5,k=3,s=2,p=1) (i=5,k=3,s=2,p=1) 的卷积计算过程,从计算结果能够看出输出特征的尺寸为  (o1=o2=o=3) (o1=o2=o=3)


下图表示参数为  (i=6,k=3,s=2,p=1) (i=6,k=3,s=2,p=1) 的卷积计算过程,从计算结果能够看出输出特征的尺寸为  (o1=o2=o=3) (o1=o2=o=3)



从上述两个例子咱们能够总结出卷积层输入特征与输出特征尺寸和卷积核参数的关系为:

o=i+2pks+1. o=⌊i+2p−ks⌋+1.

其中  x ⌊x⌋ 表示对  x x 向下取整。

反卷积层

在介绍反卷积以前,咱们先来看看卷积运算和矩阵运算之间的关系。

卷积和矩阵相乘

考虑以下一个简单的卷积层运算,其参数为  (i=4,k=3,s=1,p=0) (i=4,k=3,s=1,p=0),输出  o=2 o=2



对于上述卷积运算,咱们把上图所示的3×3卷积核展成一个以下所示的[4,16]的稀疏矩阵  C C, 其中非0元素  wi,j wi,j 表示卷积核的第  i i 行和第  j j 列。

w0,0000w0,1w0,000w0,2w0,1000w0,200w1,00w0,00w1,1w1,0w0,1w0,0w1,2w1,1w0,2w0,10w1,20w0,2w2,00w1,00w2,1w2,0w1,1w1,0w2,2w2,1w1,2w1,10w2,20w1,200w2,0000w2,1w2,000w2,2w2,1000w2,2 (w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,200000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2)

咱们再把4×4的输入特征展成[16,1]的矩阵  X X,那么  Y=CX Y=CX 则是一个[4,1]的输出特征矩阵,把它从新排列2×2的输出特征就获得最终的结果,从上述分析能够看出卷积层的计算实际上是能够转化成矩阵相乘的。值得注意的是,在一些深度学习网络的开源框架中并非经过这种这个转换方法来计算卷积的,由于这个转换会存在不少无用的0乘操做,Caffe中具体实现卷积计算的方法可参考Implementing convolution as a matrix multiplication

经过上述的分析,咱们已经知道卷积层的前向操做能够表示为和矩阵 C C相乘,那么 咱们很容易获得卷积层的反向传播就是和 C C的转置相乘

反卷积和卷积的关系

全面咱们已经说过反卷积又被称为Transposed(转置) Convolution,咱们能够看出其实卷积层的前向传播过程就是反卷积层的反向传播过程,卷积层的反向传播过程就是反卷积层的前向传播过程。由于卷积层的前向反向计算分别为乘  C C 和  CT CT,而反卷积层的前向反向计算分别为乘  CT CT 和  (CT)T (CT)T ,因此它们的前向传播和反向传播恰好交换过来。

下图表示一个和上图卷积计算对应的反卷积操做,其中他们的输入输出关系正好相反。若是不考虑通道以卷积运算的反向运算来计算反卷积运算的话,咱们还能够经过离散卷积的方法来求反卷积(这里只是为了说明,实际工做中不会这么作)。

一样为了说明,定义反卷积操做参数以下:

  • 二维的离散卷积( N=2 N=2
  • 方形的特征输入( i1=i2=i i1′=i2′=i′
  • 方形的卷积核尺寸( k1=k2=k k1′=k2′=k′
  • 每一个维度相同的步长( s1=s2=s s1′=s2′=s′
  • 每一个维度相同的padding ( p1=p2=p p1′=p2′=p′)

下图表示的是参数为(  i=2,k=3,s=1,p=2 i′=2,k′=3,s′=1,p′=2)的反卷积操做,其对应的卷积操做参数为  (i=4,k=3,s=1,p=0) (i=4,k=3,s=1,p=0)。咱们能够发现对应的卷积和非卷积操做其  (k=k,s=s) (k=k′,s=s′),可是反卷积却多了 p=2 p′=2。经过对比咱们能够发现卷积层中左上角的输入只对左上角的输出有贡献,因此反卷积层会出现  p=kp1=2 p′=k−p−1=2。经过示意图,咱们能够发现,反卷积层的输入输出在  s=s=1 s=s′=1 的状况下关系为:

o=ik+2p+1=i+(k1)2p o′=i′−k′+2p′+1=i′+(k−1)−2p



Fractionally Strided Convolution

上面也提到过反卷积有时候也被叫作Fractionally Strided Convolution,翻译过来大概意思就是小数步长的卷积。对于步长  s>1 s>1的卷积,咱们可能会想到其对应的反卷积步长  s<1 s′<1。 以下图所示为一个参数为  i=5,k=3,s=2,p=1 i=5,k=3,s=2,p=1的卷积操做(就是第一张图所演示的)所对应的反卷积操做。对于反卷积操做的小数步长咱们能够理解为:在其输入特征单元之间插入  s1 s−1 个0,插入0后把其看出是新的特征输入,而后此时步长  s s′ 再也不是小数而是为1。所以,结合上面所获得的结论,咱们能够得出Fractionally Strided Convolution的输入输出关系为:

o=s(i1)+k2p o′=s(i′−1)+k−2p



参考

conv_arithmetic

Is the deconvolution layer the same as a convolutional layer?

相关文章
相关标签/搜索