深度学习小白——卷积神经网络

一、结构概述

卷积神经网络机构基于一个假设——输入数据是图像。所以这种特有属性,使得前向传播函数实现起来更高效,并且大幅度降低了网络中参数的数量。

在神经网络中:输入是一个向量,然后每个隐层由若干的神经元组成,每个神经元都与前一层中的所有神经元连接。常规的神经网络对于大尺寸图像效果不尽人意,因为在全连接下, 权重和偏差参数会变得很多,导致网络过拟合等问题。

与常规神经网络不同,卷积神经网络的各层中的神经元是3维排列的:宽度高度、和深度。


左图是一个3层的神经网络,右边是一个卷积神经网络,图例中网络将它的神经元都排列成3个维度,卷积神经网络的每一层都将3D输入数据变化为神经元3D的激活数据输出。粉红色的输入层装的是图像,所以它的宽度和高度就是图像的宽度和高度,深度3代表了R.G,B三种颜色通道。


二、卷积网络各种层

卷积神经网络主要由三种类型的层构成:卷积层汇聚(Pooling)层,全连接层

网络结构例子:用于CIFAR-10图像数据分类的卷积神经网络的结构可以是【输入层-卷积层-ReLU层-汇聚层-全连接层】

  • 输入[32*32*3]的原始图像
  • 卷积层中,神经元与输入层中的一个局部区域相连每个神经元都计算自己与输入层相连的小区域与自己的权重的卷积,如果我们使用12个滤波器(也叫作核),得到的输出数据体的维度就是[32*32*12]
  • ReLU层将会逐个元素地进行激活函数操作,比如使用以0位阈值的max(0,x)作为激活函数,该层对数据尺寸没有改变。
  • 汇聚层在空间维度(宽度和高度)上进行降采样(down sampling)操作,数据尺寸变为[16*16*12](2*2的池化操作)
  • 全连接层将会计算分类评分,数据尺寸变为[1*1*10],其中10个数字就是对应CIFAR-10中10个类别的分类评分值。该层与常规神经网络一样

三、卷积层
卷积层的参数是由一些可学习的滤波器集合构成的。每个滤波器在空间上都比较小,但深度和输入数据一致。举例来说就是卷积神经网络第一层的一个典型滤波器尺寸就是5*5*3。在前向传播的时候,让每个滤波器都在输入数据的宽度和高度上滑动,然后计算整个滤波器和输入数据任一处的卷积(内积)。当滤波器沿着输入数据的宽度和高度滑过后,会生成一个2维的激活图(activation map),它给出了在每个空间位置处滤波器的反应。直观地说,网络会让滤波器学习到当它看到某些类型的视觉特征时就激活,具体视觉特征可以是某些方位上的边界,或者第一层上某些颜色的斑点。
每个卷积层上,我们会有一整个集合的滤波器(比如12个),每个都会生成一个不同的二维激活图,将这些激活映射在深度方向上层叠起来就生成了输出数据。

现在开始讨论神经元的连接,在空间中的排列以及它们参数共享的模式。
1.局部连接
让每个神经元与前一层中的一个局部区域连接,该连接的空间大小叫做神经元的感受野(receptive field)它的尺寸是一个超参数,但是它的深度总是和输入数据的深度一致。

【例】假设输入数据体的尺寸是[16x16x20],感受野尺寸是3x3,那么卷积层中每个神经元和输入数据体就有3x3x20=180个连接。再次提示:在空间上连接是局部的(3x3),但是在深度上是和输入数据体一致的(20)。
  

2.空间排列
3个超参数控制着输出数据体的尺寸:深度(depth)步长(stride)零填充(zero-padding)

  • 输出数据体的深度即为滤波器的数量,而每个滤波器在输入数据中寻找一些不同的特征,我们将这些沿着深度方向排列,感受野相同的的神经元集合成为深度列(depth column),也有人使用纤维(fiber)来称呼它们
  • 其次,在滑动滤波器时,必须指定步长。当步长为1时,滤波器每次移动一个像素,以此类推,这个操作会使得输出数据体在空间上变小
  • 零填充是一个超参数,零填充有一个良好的性质就是可以控制输出数据体的空间尺寸(最常用就是用来保持输入数据体在空间上的尺寸,这样输入和输出的宽高都相等)
输出数据体在空间上的尺寸可以通过输入数据体尺寸(W),卷积层中神经元的感受野尺寸(F),步长(S)和零填充的数量(P)的函数来计算,输出数据体的空间尺寸为(W-F +2P)/S+1
比如输入是7x7,滤波器是3x3,步长为1,填充为0,那么就能得到一个5x5的输出。如果步长为2,输出就是3x3。

【真实案例】Krizhevsky构架赢得了2012年的ImageNet挑战,其输入图像的尺寸是[227x227x3]。在第一个卷积层,神经元使用的感受野尺寸F=11,步长S=4,不使用零填充P=0。因为(227-11)/4+1=55,卷积层的深度K=96,则卷积层的输出数据体尺寸为[55x55x96]。55x55x96个神经元中,每个都和输入数据体中一个尺寸为[11x11x3]的区域全连接。在深度列上的96个神经元都是与输入数据体中同一个[11x11x3]区域连接,但是权重不同。

3.参数共享
在卷积层中,使用参数共享是用来控制参数的数量。在上述例子中,第一个卷积层就有55*55*96=290400个神经元,每个有11*11*3=364个参数和1个偏差。单单一层就有105705600个参数。
做一个合理的假设:如果一个特征在计算某个空间位置(x,y)时有用,那么它在计算另一个不同位置(x2,y2)时也会有用。基于这个假设,可以显著地减少参数数量。换言之,就是将深度维上一个单独的2维切片看作深度切片(depth slice),比如一个数据体尺寸为[55*55*96 ]的就有96个切片,每个尺寸[55*55]。每个深度切片上的神经元都使用同样的权重和偏差。所以例子中的第一个卷积层就只有96*11*11*3=34848个不同的权重和96个偏差。在每个深度切片中的55*55个权重使用的都是同样的参数。在反向传播的过程中,都要计算每个神经元对它的权重的梯度,但是需要把同一深度切片上的所有神经元对权重的梯度累加,这样就得到了对共享权重的梯度。这样,每个切片只更新一个权重集。

[注意]参数共享的假设是有道理的:如果在图像某些地方探测到一个水平的边界是很重要的,那么在其他一些地方也会同样是有用的,这是因为图像结构具有平移不变性。所以在卷积层的输出数据体的55x55个不同位置中,就没有必要重新学习去探测一个水平边界了。

4.反向传播
卷积操作的反向传播(同时对于数据和权重)还是一个卷积(但是是和空间上翻转的滤波器)



【1*1卷积】:最早在论文《Network In Network》提出的,主要有几个用途
  • 使得网络更深,提取到跨通道特征的aggregation
对输入feature map进行加权线性组合,再经过一个ReLU单元
  • 降维

这是在Resnet中,inception的一个分支,假设上一层是一个w*h*256,并且最后输出的是256个feature map,如果用3*3的核,操作数是w*h*256*3*3*256=589824*w*h,而在这个这个架构中只有 w*h*256*1*1*64+w*h*64*3*3*64+w*h*64*1*1*256=69632*w*h,节省了很多的参数,达到降维的目的。


  • 增加更多的非线性变化(eg.ReLU)
因为一般1*1后面都要接ReLU,所以增加了非线性层
  • 取代fc层
【扩张卷积】

最近一个研究( Fisher Yu和Vladlen Koltun的论文 )给卷积层引入了一个新的叫 扩张(dilation) 的超参数。到目前为止,我们只讨论了卷积层滤波器是连续的情况。但是,让滤波器中元素之间有间隙也是可以的,这就叫做扩张。举例,在某个维度上滤波器 w 的尺寸是3,那么计算输入 x 的方式是: w[0]*x[0] + w[1]*x[1] + w[2]*x[2] ,此时扩张为0。如果扩张为1,那么计算为:  w[0]*x[0] + w[1]*x[2] + w[2]*x[4] 。换句话说,操作中存在1的间隙。在某些设置中,扩张卷积与正常卷积结合起来非常有用,因为在很少的层数内更快地汇集输入图片的大尺度特征。比如,如果上下重叠2个3x3的卷积层,那么第二个卷积层的神经元的感受野是输入数据体中5x5的区域(可以成这些神经元的 有效感受野 是5x5)。如果我们对卷积进行扩张,那么这个有效感受野就会迅速增长。
四、汇聚层(pooling)

通常,在连续的卷积层之间会周期性地插入一个汇聚层,它的作用是逐渐降低数据体的空间尺寸。这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。汇聚使用MAX操作,对输入数据体的每一个深度切片独立进行操作,改变它的空间尺寸。常见形式是使用2*2的滤波器,以补偿为2来对每个深度切片进行降采样。将其中75%的激活信息都丢掉。每个MAX操作是从4个数字中取最大值。深度保持不变。

输入数据体尺寸 W_1\cdot H_1\cdot D_1
两个超参数:空间大小F,步长S
输出数据体尺寸W_2\cdot H_2\cdot D_2
其中,W2=(W1-F)/S+1
H2=(H1-F)/S+1
D2=D1


1.普通汇聚

除了最大汇聚,还有平均汇聚(average pooling)或L-2范式汇聚。实践证明,最大汇聚的效果比平均汇聚好。


2.反向传播

max(x,y)函数的反向传播可以理解为梯度只沿最大的数回传。因此,在前向传播经过汇聚层时,通常会把池中最大元素的索引记录下来(有时这个也叫做switches)这样在反向传播时梯度的路由就很高效。


五、全连接层

在全连接层,神经元对于前一层中的所有激活数据是全部链接的,它们的激活可以先用矩阵乘法,再加上偏差,同常规神经网络。

全连接层和卷积层之间唯一的不同就是卷积层中的神经元只与输入数据中的一个局部区域连接,并且在卷积列中的神经元共享参数。然而在两类层中,神经元都是计算点积,所以两者相互转化是可能的。

在两种变换中,将全连接层转化为卷积层在实际运用中更加有用。假设一个卷积神经网络的输入是224*224*3的图像,一系列的卷积层和汇聚层将图像数据变为尺寸为7*7*512的激活数据体。AlexNet使用了两个尺寸为4096的全连接层,最后一个有1000个神经元的全连接层用于计算分类评分。我们可以将这3个全连接层中的任意一个转化为卷积层:

  • 针对第一个连接区域是[7x7x512]的全连接层,令其滤波器尺寸为F=7,这样输出数据体就为[1x1x4096]了。
  • 针对第二个全连接层,令其滤波器尺寸为F=1,这样输出数据体为[1x1x4096]。
  • 对最后一个全连接层也做类似的,令其F=1,最终输出为[1x1x1000]
以上操作可以让 卷积网络在一张更大的输入图片上滑动,即把一张更大的图片的不同区域都分别带入到卷积网络,得到每个区域的得分,得到多个输出,只通过单个前向传播过程得到,而不是迭代计算
【举个例子】如果我们想让224x224尺寸的浮窗,以步长为32在384x384的图片上滑动,把每个经停的位置都带入卷积网络,最后得到6x6个位置的类别得分。上述的把全连接层转换成卷积层的做法会更简便。如果224x224的输入图片经过卷积层和汇聚层之后得到了[7x7x512]的数组,那么,384x384的大图片直接经过同样的卷积层和汇聚层之后会得到[12x12x512]的数组(因为途径5个汇聚层,尺寸变为384/2/2/2/2/2 = 12)。然后再经过上面由3个全连接层转化得到的3个卷积层,最终得到[6x6x1000]的输出(因为(12 - 7)/1 + 1 = 6)。这个结果正是浮窗在原图经停的6x6个位置的得分!

面对384*384的图像,让(含全连接层)的初始卷积神经网络以32像素的步长独立对图像中的224*224块进行多次评价,其效果和使用把全连接层变换为卷积层后的卷积神经网络进行一次前向传播是一样的。
六、卷积神经网络综合

1.层的排列规律
卷积神经网络中最常见的形式就是将一些卷积层和ReLU层放在一起,然后紧跟汇聚层,然后重复如此直到图像在空间上被缩小到一个足够小的尺寸。最后的全连接层得到输出,比如分类评分。

INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC

注意:几个小滤波器卷积层的组合比一个大滤波器卷积层好:假设一层一层地重叠了3*3的卷积层,在这个排列下,第一个卷积层中的每个神经元都对输入数据体有一个3*3的视野。第二个卷积层 的神经元对第一个卷积层有一个3*3的视野,也就是对输入数据体有一个5*5的视野,同样,第三个卷积层的神经元对输入数据体就有7*7的视野。但如果直接使用一个单独的7*7的感受野的卷积层,那么所有神经元的感受野也是7*7。但是有一些缺点,首先多个卷积层与非线性的激活层交替的结构,比单一卷积层的结构更能提取出深层的更好的特征,其次,假设所有的数据有C个通道,那么单独7*7卷积层将含有C*(7*7*C)=49C^2个参数,而3个3*3的卷积层仅有3*(C*(3*3*C))=27C^2个参数。


2.层的尺寸设置规律

  • 输入层:应该能被2整除
  • 卷积层:应该使用小尺寸滤波器,使用步长为1,还有要对输入数据进行零填充。如果必须使用更大的滤波器尺寸,通常只用在第一个面对原始图像的卷积层上。
  • 汇聚层:2*2的感受野,步长为2

3.有名的卷积神经网络

  • LeNet: 第一个成功的卷积神经网络应用,是Yann LeCun在上世纪90年代实现的。当然,最著名还是被应用在识别数字和邮政编码等的LeNet结构。
  • AlexNetAlexNet卷积神经网络在计算机视觉领域中受到欢迎,它由Alex Krizhevsky,Ilya Sutskever和Geoff Hinton实现。AlexNet在2012年的ImageNet ILSVRC 竞赛中夺冠,性能远远超出第二名(16%的top5错误率,第二名是26%的top5错误率)。这个网络的结构和LeNet非常类似,但是更深更大,并且使用了层叠的卷积层来获取特征(之前通常是只用一个卷积层并且在其后马上跟着一个汇聚层)。
  • ZF Net:Matthew Zeiler和Rob Fergus发明的网络在ILSVRC 2013比赛中夺冠,它被称为ZFNet(Zeiler & Fergus Net的简称)。它通过修改结构中的超参数来实现对AlexNet的改良,具体说来就是增加了中间卷积层的尺寸,让第一层的步长和滤波器尺寸更小。
  • GoogLeNet:ILSVRC 2014的胜利者是谷歌的Szeged等实现的卷积神经网络。它主要的贡献就是实现了一个奠基模块,它能够显著地减少网络中参数的数量(AlexNet中有60M,该网络中只有4M)。还有,这个论文中没有使用卷积神经网络顶部使用全连接层,而是使用了一个平均汇聚,把大量不是很重要的参数都去除掉了。GooLeNet还有几种改进的版本,最新的一个是Inception-v4
  • VGGNet:ILSVRC 2014的第二名是Karen Simonyan和 Andrew Zisserman实现的卷积神经网络,现在称其为VGGNet。它主要的贡献是展示出网络的深度是算法优良性能的关键部分。他们最好的网络包含了16个卷积/全连接层。网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2的汇聚。他们的预训练模型是可以在网络上获得并在Caffe中使用的。VGGNet不好的一点是它耗费更多计算资源,并且使用了更多的参数,导致更多的内存占用(140M)。其中绝大多数的参数都是来自于第一个全连接层。后来发现这些全连接层即使被去除,对于性能也没有什么影响,这样就显著降低了参数数量。
  • ResNet残差网络(Residual Network)是ILSVRC2015的胜利者,由何恺明等实现。它使用了特殊的跳跃链接,大量使用了批量归一化(batch normalization)。这个结构同样在最后没有使用全连接层。读者可以查看何恺明的的演讲(视频PPT),以及一些使用Torch重现网络的实验。ResNet当前最好的卷积神经网络模型(2016年五月)。何开明等最近的工作是对原始结构做一些优化,可以看论文Identity Mappings in Deep Residual Networks,2016年3月发表。


  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值