基于神经网络的目标检测论文之神经网络基础:经典卷积神经网络的结构
注:本文源自本人的硕士毕业论文,未经许可,严禁转载!
原文请参考知网:知网地址
2.3 经典卷积神经网络的结构
上一节我们讲了神经网络的结构以及网络的工作原理,本节将讲述一些优秀的卷积神经网络结构以及一些常用的网络改进方法。
2012年到2015年是深度学习快速发展的四年,先后出现了以AlexNet、VGGNet、Google InceptionNet和ResNet为代表的经典卷积神经网络。它们分别在相应年份获得了ILSVRC大赛中分类项目的冠军。以上四种经典的网络结构以其巧妙的结构设计和超高的准确率,对卷积网络的发展产生巨大的推动作用。人类最优秀的专家在ImageNet上的识别错误率在5%左右,一般人的错误率更高。目前分类效果最好的网络是ResNet,识别错误率仅3.75%。终于图像识别问题在卷积神经网络上成功解决了。
2.3.1 AlexNet
2012年,一种全新的深度神经网络模型AlexNet横空出世。AlexNet是在LeNet结构基础上增加了更深层的模型。AlexNet在当年的大赛中表现相当亮眼,它将top-5的错误率突破性地下降至16.4%,远远超越了第二名的26.2%,以绝对的优势赢下了比赛。AlexNet第一次在实际应用中成功实验了Dropout等新技术。AlexNet获胜的意义非常重大,象征着神经网络从低迷到高速增长的转折点。随后逐渐加固了卷积神经网络在计算机视觉领域的统治地位。
AlexNet进一步发扬LeNet关于深度卷积的思想,尝试了把CNN的重要思想应用到更深的结构层次。AlexNet破天荒地使用了以下新技术:
1、首次使用ReLU函数作为神经元的**函数。ReLU函数有比Sigmoid函数更好的性质,成功解决了训练深度网络时的梯度消失问题。
2、首次使用Dropout机制。训练网络时随机舍弃了一部分神经元。Dropout最早只是在论文中进行了论证,AlexNet首次将其应用到深度网络中。实验充分地验证了它的效果。
3、首次使用Max Pooling。在此之前的卷积网络模型中大多使用平均池化,为了避免平均池化常见的模糊效果,AlexNet首次使用了最大池化。并且实际实现网络的时候,AlexNet中使用的滑动窗口步长比核的还小,以增加池化层输出的重复,使得提取的特征更丰富。
4、增加LRN层。抑制响应较小的神经元,提高网络的泛化能力。
5、数据增强。随机从原始图像中截取 像素区域,在进行水平翻转,相当于扩充了上千倍的数据量。还对原始图像做一个高斯扰动,给原始数据增加一些噪声。这些操作都能降低错误率。
AlexNet网络的结构如图2-9所示,结构的前面5层为卷积层,后面3层为全连接层。可以看出中间有8层需要训练参数,每一层都用ReLU作为**函数。网络的输出层是由Softmax层作为分类器,共有1000类输出。前两个卷积层后跟一个LRN层,Max pooling池化层出现在两个LRN层和最后一个卷积层后。
图2-9 AlexNet的网络结构
2.3.2 VGGNet
VGGNet是牛津大学和Google公司共同发明的卷积神经网络。VGGNet经过循环累加卷积和池化块(一个块包含 的卷积核和 的池化核),成功地构建起19层深的卷积神经网络。VGGNet迈出了探索卷积网络的深度和性能之间的关系的坚实一步。VGGNet相比AlexNet错误率又下降很多,并取得2014年比赛的第二名。VGGNet的成功证明了卷积网络的结构可以非常简洁。网络一致使用了相同尺寸的卷积核和最大池化核。VGGNet能被简单地移植到其他图像数据上,具有很强的泛化能力。VGGNet至今依然是最常见的网络,很多研究都用VGGNet来提取图像特征。表2-2是VGGNet各级别的网络结构图。
表2-2 VGG-16网络结构图
Conv 3×3 Conv 3×3 Conv 3×3 Pooling Output size
Input 3×224×224
Block1 slide: 1
padding: 1
kernel size: 3
kernel:64 slide: 1
padding: 1
kernel size: 3
kernel:64 — type:Max
slide: 2
kernel: 2 112×112×64
Block2 slide: 1
padding: 1
kernel size: 3
kernel:128 slide: 1
padding: 1
kernel size: 3
kernel:128 — type:Max
slide: 2
kernel: 2 56×56×128
Block3 slide: 1
padding: 1
kernel size: 3
kernel:256 slide: 1
padding: 1
kernel size: 3
kernel:256 slide: 1
padding: 1
kernel size: 3
kernel:256 type:Max
slide: 2
kernel: 2 28×28×256
Block4 slide: 1
padding: 1
kernel size: 3
kernel:512 slide: 1
padding: 1
kernel size: 3
kernel:512 slide: 1
padding: 1
kernel size: 3
kernel:512 type:Max
slide: 2
kernel: 2 14×14×512
Block5 slide: 1
padding: 1
kernel size: 3
kernel:512 slide: 1
padding: 1
kernel size: 3
kernel:512 slide: 1
padding: 1
kernel size: 3
kernel:512 type:Max
slide: 2
kernel: 2 7×7×512
Full connect layer-1 4096 output 1×1×4096
Full connect layer -2 4096 output 1×1×4096
Full connect layer -3 1000 output 1×1×1000
Softmax
VGGNet中间层采用卷积段的形式定义,这样定义的好处是容易扩展网络的结构。这里的VGGNet定义了5个卷积段,并且每个卷积段内有2到4个卷积层。每一个卷积段结尾处接一个MaxPooling层压缩特征。就具体设计而言,每个卷积段内的卷积核数量相等,并随着段的增加卷积核数量也翻倍,这有助于提取深度特征。在设计卷积段的时候,用到了一个很巧妙的设计,就是每个段里连续出现多个尺寸一样的 的卷积层堆叠。如图2-10所示,由两个 的卷积层串联起来使用效果相当于一个 的卷积层,进一步地,将3个 的卷积层串联起来效果相当于一个 的卷积层。这当然是一个有用的设计,尽管最终效果是一样的,但是串联的 卷积层有比一个 的卷积层更少的参数量,计算一下发现只有后者的 。这种设计最重要的一点是,串联的3个卷积层比只有1个卷积层的模型做了更多的非线性变换,串联模块使用了多次ReLU**函数,也就使得卷积网络对特征的学习能力更强。
图2-10 两个串联的3×3卷积层
表2-3展示了网络每一级别的参数量。直观地从数据走势来看,从前往后每一级网络的层次逐渐变深,然而参数量却没有显著增加,主要原因是卷积使用了共享参数,主要的参数量消耗在了最后3个全连接层。也间接说明了卷积共享参数的重要性。
VGGNet网络在训练时先训练前面类型的简单网络,再重复利用网络中的权重来初始化后面几个复杂的模型,这样做的好处是让训练过程收敛的更快。网络训练时还使用了其他方法,比如VGGNet还使用数据增强将原始数据缩放到不同尺寸,这样就能成倍增加数据量,增加数据量是防止模型过拟合的重要方法。VGGNet分别训练了16层和19层的网络结构,这两种结构均能达到7.5%的错误率。
2.3.3 InceptionNet
Google公司开发的InceptionNet网络结构出现在2014年的比赛中,跟VGGNet同一年。在当时的比赛中,InceptionNet以微弱的优势战胜了VGGNet,并取得第一名。当年比赛时用的InceptionNet版本通常被称为Inception V1,该版本提出了创造性的观点就是既有效限制了计算量和参数量,同时还能获得优秀的分类性能。Inception V1版本具有22层深的网络,比当时其他网络都要深。模型增加了深度,但是又保证了计算量只有数十亿次运算,和只有百万级的参数量,一举成为当时最优秀的深度模型。
Inception V1模型的主要目的之一就是降低参数量。研究发现,首先模型随着参数的增长呈现爆发式的增长,那么需要提供给模型学习的数据量就越大,然而高质量的数据非常稀缺。其次随着参数的增加,耗费的计算资源也呈现出指数级的增长。Inception V1模型之所以准确率高且参数少,主要是因为:模型层数更深也就使得模型表达能力更强,模型还首创性地用平均池化层代替最后的全连接层。由前馈网络的结构可知,全连接层几乎占据了神经网络中绝大部分的参数量。而且全连接会引起模型过拟合,删除了全连接层后模型收敛得更快,并且减轻了过拟合。模型首创性地使用全局平均池化层,进而取代全连接层的做法借鉴了“网络中还有网络”的思想。Inception V1同样精心设计了Inception Module模块可以很容易构造出深层网络,也提高了参数的利用率。深入到网络模型内部,可以看到模块本身如同大网络中包含了许多个小网络,Inception Module模块结构经过反复堆叠在一起形成一个大网络。
大网络中的每一个分支网络对输入进行 的卷积运算。事实证明, 卷积是一个相当实用的模型, 卷积最主要的优势就是它可以跨通道组织信息。由图2-11所示,模型的的所有分支都用到了 卷积,除了第一个Inception Module,其他分支还使用了 和 的卷积。这样经过一系列复杂的组合就能提高网络的表达能力。模型的所有分支在最后一步通过一个聚合操作进行合并,合并后的最终结果传递给最后的分类层。
图2-11 Inception Module结构图
通常认为大型神经网络的有效连接方式应该是稀疏的,稀疏连接对减轻过拟合并降低计算量的影响至关重要。InceptionNet设计的主要目的之一就是找到最优的稀疏结构单元。想要得到一个好的稀疏结构,网络模型就要把相关性高的一些神经元节点连接在一起,不相关或者相关性低的节点尽量保持不连接。对于人工提取特征的数据集来说可能需要用机器学习算法对神经元节点进行聚类操作。但是我们知道在图像数据中,邻近像素点或者相邻区域的数据具有天然的高度相关性,这也是为什么相邻的像素点会被卷积操作连接在一起。当网络深度不断加大,模型中会出现多个卷积核,于是特征图上计算同一区域,但不同通道的卷积核的输出结果相关性极高。这时 的卷积就派上用场了,它能很轻松地将一组在同一区域但在不同通道上,相关性又极高的特征连接起来。回过头来看,Inception Module中频繁地使用 的卷积操作能够增加网络稀疏性的原因。
在整个网络中最理想的是后面的Inception 模块可以提取更抽象的特征。一般网络会设计多个堆叠的Inception模块,而且越往后的Inception模块中的卷积的密集程度应该逐渐降低,从而实现学习更大尺寸的特征。为了使卷积密集程度逐渐下降,在设计Inception Module时, 卷积的数量最多, 和 卷积次之。因此越往后的Inception Module中, 卷积和 卷积的比例越大,也就能学习更大尺寸的特征。
Inception V2学习了VGGNet的想法。使用了两个 的卷积代替 卷积的大卷积。伴随着V2版本的问世,正则化方法Batch Normalization(BN)的提出和实践表明,大型卷积神经网络分批次进行训练速度比一次性训练整个数据集要快上数倍,同时模型收敛得更快且分类准确率也能得到大幅提高。通过这样一种非常有效的正则化方法,最终V2网络取得的top-5错误率为4.8%,已经优于人眼水平。
Inception V3在V2版本上引入了两方面的改造:一是引入“小卷积”的思想,具体做法是将较大的二维卷积拆分为两个较小的一维卷积,比如将 的卷积拆分成 卷积和 卷积。这样做有很多好处,一方面大大减少了参数量,减轻了过拟合;另一方面,Inception V3继续在Inception模块中寻找优化方法,除了在整个模型中使用小网络,还在小网络中继续增加小网络。
Inception V4相比V3主要是采用了ResNet的思想,而ResNet将在下一节中详细介绍。
2.3.4 ResNet
ResNet(残差神经网络)是由微软研究院提出的,以不可思议的错误率(仅3.57%)获得了2015年识别大赛的冠军。模型通过重复利用“残差块”成功地训练了152层深的神经网络。ResNet以其独特的“跳跃式连接”的结构可以快速地构造出非常深的神经网络模型,并且这种跳跃式连接能加速模型的训练,进而提高模型的准确率。理论和实验结果表明,ResNet在达到最出众的准确率的同时参数量却比同类模型低,表现十分亮眼。ResNet同时还是个移植性很好的结构,甚至可以不用修改直接用在Inception Module中。
ResNet借鉴了“skip-connect”的方式,这种思想实现不相邻的层之间的跨越连接。以往认识的前馈网络只是对原始输入数据仅做一次非线性变换,而跳跃连接则会保留一定比例的原始输入。如图2-12所示,前一层的数据就会有一定比例不进行特征向量的矩阵乘法和**函数的非线性变换,直接传输到下一层。ResNet同样也是允许原始输入信息直接传递到后面的层中。图2-12中某一层神经网络的输入是x,模型最终期望输出为 ,如果直接将原始输入数据x传到输出作为结果的一部分,那么模型需要学习的目标就是变成了 。ResNet使用“跳跃连接”等于改变了学习目标,模型学习的不再是一个完整的输出 ,而是输出与输入之间的差别 ,这种差别也叫残差(Residual)。图2-12所示是一个ResNet的残差学习单元。
全连接网络或者前面介绍的前馈卷积网络层与层之间传递数据时,大多会存在信息丢失等问题。ResNet网络通过“跳跃连接”直接将信息绕过中间层传递到不相邻的层中,这在一定程度上保护了信息的完整性。训练过程中整个网络只需要学习输入和输出差别的那一部分,从而简化了训练的难度。
不同于一般直连的前馈网络,ResNet模型中前面层会多出很多分支将输入直接传递给后面的层作为输入。后面的网络层不再学习完整的模型,只需要学习残差。同Inception模块类似,ResNet模型首先定义Residual Block(残差单元),然后不断累加残差单元得到最终的模型。一般除了有两层的Residual Block,还有三层的Residual Block。图2-13中左边的两层Residual Block包含两个 卷积,它们有相同的输出通道数。而3层的Residual Block则借鉴了InceptionNet中的 卷积,并且在一个 卷积的前后使用,两种学习模块如图2-13所示:
表2-4是ResNet在不同深度时的网络配置。从表中可以清晰地看出各种网络结构的基础结构很类似,主要是由不同尺寸的Residual Block累加而成的。Residual Block之间会加入一个卷积层和一个池化层。Residual Block内部的一系列卷积层提取的特征图尺寸都是一样的。观察训练集上训练ResNet网络的过程发现,不断加深的层数并没有导致训练集上的误差增大,并且在测试集上的表现良好。ResNet一经推出,就被其他网络模型借鉴,由InceptionNet借鉴得到的模型在ImageNet数据集上取得了更低的错误率。