由浅入深:CNN中卷积层与转置卷积层的关系

欢迎你们前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~git

本文由forrestlin发表于云+社区专栏github

导语:转置卷积层(Transpose Convolution Layer)又称反卷积层或分数卷积层,在最近提出的卷积神经网络中愈来愈常见了,特别是在对抗生成神经网络(GAN)中,生成器网络中上采样部分就出现了转置卷积层,用于恢复减小的维数。那么,转置卷积层和正卷积层的关系和区别是什么呢,转置卷积层实现过程又是什么样的呢,笔者根据最近的预研项目总结出本文。网络

1. 卷积层和全链接层

在CNN提出以前,咱们所提到的人工神经网络应该多数状况下都是前馈神经网络,二者区别主要在于CNN使用了卷积层,而前馈神经网络用的都是全链接层,而这两个layer的区别又在于全链接层认为上一层的全部节点下一层都是须要的,经过与权重矩阵相乘层层传递,而卷积层则认为上一层的有些节点下一层实际上是不须要的,因此提出了卷积核矩阵的概念,若是卷积核的大小是nm,那么意味着该卷积核认为上一层节点每次映射到下一层节点都只有nm个节点是有意义的,具体的映射方式下一节会讲到。到这里,有些初学者会认为全链接层也能够作到,只要让权重矩阵某些权重赋值为0就能够实现了,例如假设在计算当前层第2个节点时认为上一层的第1个节点我不须要,那么设置w01=0就能够了。其实没错,卷积层是能够看作全链接层的一种特例,卷积核矩阵是能够展开为一个稀疏的包含不少0的全链接层的权重矩阵,下图就是一个由44图片通过33卷积核生成一个大小为2*2output时,卷积核所展开的全链接层的权重矩阵。架构

img
卷积核对应的全链接层权重矩阵

能够看到,上面的矩阵大小为416,比卷积核33大了很多,所以使用卷积层而不用全链接层第一个缘由就是能够极大的减小参数的个数,第二个缘由就是卷积核关注的是某几个相邻的节点之间的关系,学习了图片的局部特征,能够说是带有目的性的学习,例如33的卷积核学习的就是相互距离为2的节点之间的关系。这与全链接层无区别的对待全部节点进行学习有极大的差异,这样一来就解决了前馈神经网络不能学习位移不变性的缺点。举个栗子,当咱们在前馈神经网络中学习一个44的图片中是否有横折图案时,使用下图中4个训练数据进行训练,那么最终只会对5,6,9,a这四个节点的权重有所调节,而后若是出现以下图最后一张图片做为测试时,就会致使网络没法识别,而因为卷积核在不一样节点间权重是共享的,因此就天然而然克服了这个问题。机器学习

img
卷积克服平移不变性

2. 卷积层的运算过程

2.1 最简单的卷积

卷积层的运算其实就是将多个卷积核做用于输入上,以下图所示,是最简单的一个卷积核所作的运算,no padding,no stride,底下蓝色方块看作是输入的图片,阴影部分就是33的卷积核(通常卷积核是个正方形,且边长为奇数),卷积核扫过期便与输入相乘再相加,最终获得22的输出,对应青色区域。ide

img
no padding, no stride的卷积

一般一层卷积层会包含多个卷积核,表明着卷积层的输出深度,例以下图就是咱们常常在论文中看到的深度网络的架构,其中第一层就是卷积层+最大池化层,先无论最大池化层,至少咱们能够明确卷积核的大小是55,卷积核个数是16,该层输出的size是1818。函数

img
论文常见的卷积层

2.2 带padding的卷积

从最简单的卷积动图中咱们能够看到,通过卷积操做,输出会比输入要小,可是有时候咱们但愿输出的size要与输入保持一致,而padding就是为了这个而引入的,而这种为了让输入和输出size保持同样的padding,咱们会称之为"same padding",可参考下面的动图,卷积核大小是3*3,padding是1,padding实际的表现就是在输入的四周补0,padding是多少就补多少层,且上限是卷积核大小-1,正以下图中虚线区域,通常来讲,论文中是不会给出padding的大小,须要咱们本身推导,推导公式可见下文。学习

img
padding=1的卷积

根据padding大小不一样,咱们能够分为三种padding:测试

  • same padding: 为了让输出和输入的size同样而补上的padding,例如33的核,same padding = 1,55的核,same padding = 2。
  • full padding: padding = kernel size - 1
  • valid padding: padding = 0

2.3 stride大于1的卷积

stride就是步长,表示卷积核两次卷积操做的距离,默认是1,上述讲的两个例子步长都是1,而下面两个动图展现的是stride为2的状况,分别是无padding和有padding的状况。一般stride大于1时咱们称为等距下采样,由于这样输出确定会丢失信息,size比输入的小。ui

img
no padding, stride=2的卷积

img
padding=1, stride=2的卷积

2.4 卷积核输入输出size与卷积核的关系

上文中咱们提到padding一般须要咱们本身算出来,那么咱们该怎么算呢,其实就是根据输入输出size和卷积核大小的关系算出来的,上面提到的几种卷积,其实就是卷积操做的三个参数,核大小(F)、padding(P)和stride(S),若是细心的读者在看动图时就会发现输出size是能够根据输入size和那三个参数计算出来的,公式以下,这里只给出宽度的计算,高度也是同样的。

W2=(W1−F+2P)÷S+1

这里咱们注意到上面的公式是有除法的,因此就会存在除不尽的状况,这时候咱们须要向下取整,这种状况咱们称为odd卷积,其过程可参考下面动图。

img
odd卷积

3. 转置卷积层

讲完卷积层后,咱们来看CNN中另外一个进行卷积操做的层次转置卷积层,有时咱们也会称作反卷积层,由于他的过程就是正常卷积的逆向,可是也只是size上的逆向,内容上不必定,因此有些人会拒绝将二者混为一谈。转置卷积层最大的用途就是上采样了,刚刚咱们说到在正常卷积中stride大于1时咱们进行的是等距下采样,会让输出的size比输入小,而转置卷积层咱们就会用stride小于1的卷积进行上采样,使输出的size变大,因此转置卷积层还有个别称就是分数卷积层。上采样最多见的场景能够说就是GAN中的生成器网络,以下图所示,虽然论文做者使用的是conv,但因为它的步长为1/2,因此表明的就是转置卷积层。

img
转置卷积例子

为了理解转置卷积层,咱们须要明白什么叫作正常卷积的逆向,这一般也是新手难以理解的地方,下面笔者经过两个图来更好的解释,第一个图是正常卷积的过程,第二个图就是其对应的转置卷积,在第一个图中,大的正方形中数字1只参与小正方形中数字1的计算,那么在转置卷积中,大正方形的1也只能由小正方形的1生成,这就是逆向的过程。

img
no padding, no stride的卷积

img
转置卷积.png

和讲述正常卷积的过程同样,笔者下面也会一一给出相对应的转置卷积。

3.1 no padding no stride的卷积对应的转置卷积

上面用做解释转置卷积的逆向过程时用到的图其实就是最简单(no padding, no stride)卷积以及其对应的转置卷积,这里给出它的动图。

img
no padding, no stride的卷积转置

3.2 带padding的卷积的转置卷积

在正卷积中若是是有padding,那么在转置卷积中不必定会有padding,其计算公式下文会给出,这里先给出2.2对应的转置卷积动图。

img
padding为1的卷积转置

3.3 stride大于1的卷积的转置卷积

在本节一开始就讲到,stride大于1的卷积是下采样,那么其对应的转置卷积即是stride小于1的上采样,可是不论是在pyTorch仍是TensorFlow中,convTranspose函数的参数都是整数,不可能将stride设置为小于1的浮点数,那么咱们会依然给convTranspose函数传入正卷积的stride,而convTranspose是怎么作的呢,可见下面的动图,它是2.3中无padding卷积对应的转置卷积,咱们先不看转置卷积中的转置padding,也就是动图中外部的虚线区域,而后会发现每两个蓝色块之间都插入了白色块,也就是0,这样一来,卷积核每移动一步不就至关因而只移动了1/2步嘛,因此咱们能够得出每两个蓝色块之间须要插入stride -1个0。

img
stride为2的卷积转置

3.4 正卷积和转置卷积的换算关系

3.4.1 转置卷积的padding

从上面3个例子的转置卷积中咱们能够发现,若是用正卷积实现转置卷积时,卷积核的大小是保持不变的,而stride是为正卷积stride的倒数(只是咱们插入0来模拟分数移动),最后,转置卷积的padding要怎么算呢,虽然若是咱们调用pyTorch或TensorFlow时不须要管,传入正卷积的padding便可,可是理解convTranspose是怎么作的也有助于咱们理解转置卷积。说了这么多,其实在咱们为了让转置卷积保证是正卷积的逆向时,咱们就不得不补充转置padding,咱们用PT表示,其计算公式为:PT=F−P−1,其中F为正卷积的核大小,P为正卷积的padding。

3.4.2 转置卷积的输出size

这个其实很好算,由于咱们都说转置卷积的逆向,因此咱们只需在2.4给出公式中转换下求出W1便可,公式以下:

W1=(W2−1)×S−2P+F

其中S是正卷积的stride,P是正卷积的padding,F是正卷积的核边长。

3.4.3 odd卷积的转置卷积

这个能够说是转置卷积中最难理解的一种状况,在2.4中咱们提到在除以stride时可能会除不尽要向下取整,那么咱们在求W1时就会有不肯定性,举个栗子,仍是第3节一开始给出的图,咱们是但愿将W/4的图放大到W/2的程度,这是一个转置卷积的过程,咱们先算一遍正卷积,从W/2下采样到W/4,k表明核边长为3,s是stride为1/2的倒数,即2,padding根据2.4的公式推导为1,因此正卷积的计算公式是:(W2−3+2)÷2+1=W4+12,而后向下取整就是W4,和图上显示的是同样,可是若是咱们经过3.4.2的公式反过来计算,就是(W4−1)×2−2+3=W2−1,这就是odd转置卷积的不肯定性,咱们再回头看2.4给出的动图,会发现右边和下边的填充区域咱们并无进行卷积运算,由于向下取整而忽略了,因此咱们在转置卷积时须要将这部分加回来,所以,在PyTorch中convTranspose函数还有一个参数output_padding就是负责处理这个的,TensorFlow应该也有相应的参数,笔者不太熟悉,下面就是PyTorch对该参数的描述,和咱们遇到的情形如出一辙。

img
PyTorch中转置卷积的output_padding参数

至于output_padding的值,应该为(W1−F+2P)%S,在上面提到的例子中就应该是1。

4. 总结

本文先是介绍了卷积神经网络和传统的前馈神经网络的联系和区别,而后再经过不一样参数的卷积过程阐述卷积运算,最后再介绍刚入门深度学习时晦涩难懂的转置卷积,给出不一样参数下正卷积所对应的转置卷积,最后总结出在卷积运算中所用到的公式。但愿笔者上述的分析和解释能对刚入门CNN的同窗有所帮助,并且笔者是从事iOS开发的,对于CNN和深度学习也是刚刚入门,但愿各位AI大牛们不吝指教。

5. 参考文档

相关阅读 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

此文已由做者受权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

相关文章
相关标签/搜索