本文主要介绍一下CNN的几种经典模型比较。之前自己也用过AlexNet和GoogleNet,网络上关于各种模型的介绍更是形形色色,自己就想着整理一下,以备自己以后查阅方便
LeNet5
先放一张图,我感觉凡是对深度学习有涉猎的人,对这张图一定不会陌生,这就是最早的LeNet5的平面结构图。
Lenet5诞生于1994年,是最早的卷积神经网络之一,并且推动了深度学习的发展。Caffe中LeNet的配置文件,从中我们可以看出Lenet5由两个卷积层,两个池化层,以及两个全连接层组成。卷积都是5*5的filter,步长为1,。池化都是max-pooling
Lenet5特征能够总结为如下几点:
(1)卷积神经网络使用三个层作为一个系列:卷积、池化、非线性
(2)使用卷积提取空间特征
(3)使用映射到空间均值下采样
(4)双曲线(tanh)或s型(sigmoid)形式的非线性
(5)多层神经网络(MLP)作为最后的分类器
(6)层与层之间的稀疏链接矩阵避免大的计算成本
AlexNet
2012年,ImageNet比赛冠军的model–Alexnet,可以说是LeNet的一种更深更宽的版本。AlexNet包含了6亿3000万个连接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面连接了最大池化层,最后还有3个全连接层。AlextNet以显著的优势赢得了ILSVRC比赛的冠军,top-5的错误率从之前的25.8%降低至16.4。 AlexNet的Caffe的model文件
上图之所以分为两层,是因为AlexNet训练时用了两块GPU。
ALexNet的主要技术点在于:
(1)使用RELU作为CNN的激活函数,解决了sigmoid在网络较深时的梯度弥散问题。
(2)训练时使用了Dropout随机忽略一部分神经元,以避免模型过拟合。
(3)在CNN中使用重叠的最大池化,步长小于池化核,这样输出之间会有重叠和覆盖,提升了特征的丰富性。此前CNN普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊性效果。
(4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈比较小的神经元,增强了模型的泛化能力。
(5)使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵计算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。
(6)使用数据增强,减轻过拟合,提高泛化能力
具体打开AlextNet的每一阶段来看:
VGG
VGG是第一个在各个卷积层使用更小的3*3过滤器(filter),并把他们组合作为一个卷积序列进行 处理的网络,它的特点就是连续conv多,计算量巨大。
VGG的巨大进展是通过依次采用多个3*3卷积,能够模拟出更大的感受野(receptive field)的效果,两个3*3卷积可以模拟出5*5的感受野,三个3*3的卷积可以模拟出7*7的感受野
VGG 网络使用多个 3×3 卷积层去表征复杂特征。注意 VGG-E 的第 3、4、5 块(block):256×256 和 512×512 个 3×3 过滤器被依次使用多次以提取更多复杂特征以及这些特征的组合。其效果就等于是一个带有 3 个卷积层的大型的 512×512 大分类器。这显然意味着有大量的参数与学习能力。但是这些网络训练很困难,必须划分到较小的网络,并逐层累加。这是因为缺少强大的方式对模型进行正则化,或者或多或少约束大量由于大量参数增长的搜索空间。
VGG-16和VGG-19的表现效果差不多,所以工业上还是用VGG-16的比较多
VGG用反复堆叠3*3的小型卷积核和2*2的最大池化层,通过不断加深网络结构来提升性能,VGGNet成功地构筑了16-19层的深度卷积网络。
VGG拓展性很强,迁移到其他图片数据上的泛化性非常好。
整个网络都是用同样大小的卷积核尺寸(3*3)和最大池化尺寸(2*2),可以用来提取特征。
用VGG的模型在domain specific的图像分类任务上进行再训练相当于提供了非常好的初始化权重
表一所示为VGGNet各级别的网络结构图,表2所示为每一级别的参数量,从11层的网络一直到19层的网络都有详尽的性能测试。虽然从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。这其中的D、E也就是我们常说的VGGNet-16和VGGNet-19。C很有意思,相比B多了几个1´1的卷积层,1´1卷积的意义主要在于线性变换,而输入通道数和输出通道数不变,没有发生降维。
VGGNet拥有5段卷积,每一段内有2~3个卷积层,同时每段尾部会连接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量一样,越靠后的段的卷积核数量越多:64 – 128 – 256 – 512 – 512。
VGGNet在训练时有一个小技巧,先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快。在预测时,VGG采用Multi-Scale的方法,将图像scale到一个尺寸Q,并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸Q的结果平均得到最后结果,这样可提高图片数据的利用率并提升预测准确率。同时在训练中,VGGNet还使用了Multi-Scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224´224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。
实践中,作者令S在[256,512]这个区间内取值,使用Multi-Scale获得多个版本的数据,并将多个版本的数据合在一起进行训练。最终提交到ILSVRC 2014的版本是仅使用Single-Scale的6个不同等级的网络与Multi-Scale的D网络的融合,达到了7.3%的错误率。不过比赛结束后作者发现只融合Multi-Scale的D和E可以达到更好的效果,错误率达到7.0%,再使用其他优化策略最终错误率可达到6.8%左右,非常接近同年的冠军Google Inceptin Net。同时,作者在对比各级网络时总结出了以下几个观点。
(1)LRN层作用不大。
(2)越深的网络效果越好。
(3)1´1的卷积也是很有效的,但是没有3´3的卷积好,大一些的卷积核可以学习更大的空间特征。
接下来主要解析下VGG-16:
VGG模型主要关注的是网络的深度,因此它固定了网络的其他参数,通过增加卷积层来增加网络的深度
网络架构:
训练输入:固定尺寸224*224的RGB图像。
预处理:每个像素值减去训练集上的RGB均值。
卷积核:一系列3*3卷积核堆叠,步长为1,采用padding保持卷积后图像空 间分辨率不变。
空间池化:紧随卷积“堆”的最大池化,为2*2滑动窗口,步长为2。
全连接层:特征提取完成后,接三个全连接层,前两个为4096通道,第三个为1000通道,最后是一个soft-max层,输出概率。
所有隐藏层都用非线性修正ReLu.
使用3*3卷积的优点:
三个卷积堆叠具有三个非线性修正层,使模型更具判别性;
其次三个 3*3卷积参数量更少,相当于在7*7卷积核上加入了正则化,便于加快训练.
下图来看,在计算量这里,为了突出小卷积核的优势,拿同conv3x3、conv5x5、conv7x7、conv9x9和conv11x11,在224x224x3的RGB图上(设置pad=1,stride=4,output_channel=96)做卷积,卷积层的参数规模和得到的feature map的大小如下:
分类框架:
a):训练
训练方法基本与AlexNet一致,除了多尺度训练图像采样方法不一致。 训练采用mini-batch梯度下降法,batch size=256;
采用动量优化算法,momentum=0.9;
采用L2正则化方法,惩罚系数0.00005;
dropout比率设为0.5;
初始学习率为0.001,当验证集准确率不再提高时,学习率衰减为原来的0.1 倍,总共下降三次;
总迭代次数为370K(74epochs);
数据增强采用随机裁剪,水平翻转,RGB颜色变化;
设置训练图片大小的两种方法:
定义S代表经过各向同性缩放的训练图像的最小边。
第一种方法针对单尺寸图像训练,S=256或384,输入图片从中随机裁剪 224*224大小的图片,原则上S可以取任意不小于224的值。
第二种方法是多尺度训练,每张图像单独从[Smin ,Smax ]中随机选取S来进行尺 寸缩放,由于图像中目标物体尺寸不定,因此训练中采用这种方法是有效的,可看作一种尺寸抖动的训练集数据增强。
论文中提到,网络权重的初始化非常重要,由于深度网络梯度的不稳定性, 不合适的初始化会阻碍网络的学习。因此我们先训练浅层网络,再用训练好的浅层网络去初始化深层网络。
b):测试
测试阶段,对于已训练好的卷积网络和一张输入图像,采用以下方法分类:
首先,图像的最小边被各向同性的缩放到预定尺寸Q;
然后,将原先的全连接层改换成卷积层,在未裁剪的全图像上运用卷积网络, 输出是一个与输入图像尺寸相关的分类得分图,输出通道数与类别数相同;
最后,对分类得分图进行空间平均化,得到固定尺寸的分类得分向量。
我们同样对测试集做数据增强,采用水平翻转,最终取原始图像和翻转图像 的soft-max分类概率的平均值作为最终得分。 由于测试阶段采用全卷积网络,无需对输入图像进行裁剪,相对于多重裁剪效率会更高。但多重裁剪评估和运用全卷积的密集评估是互补的,有助于性能提升。
VGG的模型表明深度有利于分类准确率的提升,并且一个比较重要的思想是卷积可代替全连接。整体参数达1亿4千万,主要在于第一个全连接层,用卷积代替后,参数量下降且无精度损失
GoogleNet与Inception
来自谷歌的 Christian Szegedy 开始追求减少深度神经网络的计算开销,并设计出 GoogLeNet——第一个 Inception 架构(参见:Going Deeper with Convolutions)。
那是在 2014 年秋季,深度学习模型正在变得在图像与视频帧的分类中非常有用。大多数怀疑者已经不再怀疑深度学习与神经网络这一次是真的回来了,而且将一直发展下去。鉴于这些技术的用处,谷歌这样的互联网巨头非常有兴趣在他们的服务器上高效且大规模庞大地部署这些架构。
Christian 考虑了很多关于在深度神经网络达到最高水平的性能(例如在 ImageNet 上)的同时减少其计算开销的方式。或者在能够保证同样的计算开销的前提下对性能有所改进。
他和他的团队提出了 Inception 模块:
初看之下这不过基本上是 1×1、3×3、5×5 卷积过滤器的并行组合。但是 Inception 的伟大思路是用 1×1 的卷积块(NiN)在昂贵的并行模块之前减少特征的数量。这一般被称为「瓶颈(bottleneck)」。
GoogLeNet 使用没有 inception 模块的主干作为初始层,之后是与 NiN 相似的一个平均池化层加 softmax 分类器。这个分类器比 AlexNet 与 VGG 的分类器的运算数量少得多。这也促成一项非常有效的网络设计,参见论文:An Analysis of Deep Neural Network Models for Practical Applications。
Google Inception Net首次出现在ILSVRC 2014的比赛中(和VGGNet同年),就以较大优势取得了第一名。那届比赛中的Inception Net通常被称为Inception V1,它最大的特点是控制了计算量和参数量的同时,获得了非常好的分类性能——top-5错误率6.67%,只有AlexNet的一半不到。Inception V1有22层深,比AlexNet的8层或者VGGNet的19层还要更深。但其计算量只有15亿次浮点运算,同时只有500万的参数量,仅为AlexNet参数量(6000万)的1/12,却可以达到远胜于AlexNet的准确率,可以说是非常优秀并且非常实用的模型。
Inception V1降低参数量的目的有两点,第一,参数越多模型越庞大,需要供模型学习的数据量就越大,而目前高质量的数据非常昂贵;第二,参数越多,耗费的计算资源也会更大。Inception V1参数少但效果好的原因除了模型层数更深、表达能力更强外,还有两点:一是去除了最后的全连接层,用全局平均池化层(即将图片尺寸变为1´1)来取代它。全连接层几乎占据了AlexNet或VGGNet中90%的参数量,而且会引起过拟合,去除全连接层后模型训练更快并且减轻了过拟合。用全局平均池化层取代全连接层的做法借鉴了Network In Network(以下简称NIN)论文。二是Inception V1中精心设计的Inception Module提高了参数的利用效率,这一部分也借鉴了NIN的思想,形象的解释就是Inception Module本身如同大网络中的一个小网络,其结构可以反复堆叠在一起形成大网络。不过Inception V1比NIN更进一步的是增加了分支网络,NIN则主要是级联的卷积层和MLPConv层。一般来说卷积层要提升表达能力,主要依靠增加输出通道数,但副作用是计算量增大和过拟合。每一个输出通道对应一个滤波器,同一个滤波器共享参数,只能提取一类特征,因此一个输出通道只能做一种特征处理。而NIN中的MLPConv则拥有更强大的能力,允许在输出通道之间组合信息,因此效果明显。可以说,MLPConv基本等效于普通卷积层后再连接1´1的卷积和ReLU激活函数。
Inception V1
受到 NiN 的启发,Inception 的瓶颈层(Bottleneck Layer)减少了每一层的特征的数量,并由此减少了运算的数量;所以可以保持较低的推理时间。在将数据通入昂贵的卷积模块之前,特征的数量会减少 4 倍。在计算成本上这是很大的节约,也是该架构的成功之处。
Naive Inception:
Inception module 的提出主要考虑多个不同 size 的卷积核能够增强网络的适应力,paper 中分别使用1*1、3*3、5*5卷积核,同时加入3*3 max pooling。
随后文章指出这种 naive 结构存在着问题:
每一层 Inception module 的 filters 参数量为所有分支上的总数和,多层 Inception 最终将导致 model 的参数数量庞大,对计算资源有更大的依赖。
在 NIN 模型中与1*1卷积层等效的 MLPConv 既能跨通道组织信息,提高网络的表达能力,同时可以对输出有效进行降维,因此文章提出了Inception module with dimension reduction,在不损失模型特征表示能力的前提下,尽量减少 filters 的数量,达到降低模型复杂度的目的:
如下图所示,Inception Module:
Inception Module 的4个分支在最后通过一个聚合操作合并(在输出通道数这个维度上聚合)。
完整的 GoogLeNet 结构在传统的卷积层和池化层后面引入了 Inception 结构,对比 AlexNet 虽然网络层数增加,但是参数数量减少的原因是绝大部分的参数集中在全连接层,最终取得了 ImageNet 上 6.67% 的成绩。
Inception V2网络
2015 年 2 月,Batch-normalized Inception 被引入作为 Inception V2(参见论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift)。
Inception V2 学习了 VGG 用两个3´3的卷积代替5´5的大卷积,在降低参数的同时建立了更多的非线性变换,使得 CNN 对特征的学习能力更强:
另外提出了著名的 Batch Normalization(以下简称BN)方法。BN 是一个非常有效的正则化方法,可以让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅提高。BN 在用于神经网络某层时,会对每一个 mini-batch 数据的内部进行标准化(normalization)处理,使输出规范化到 N(0,1) 的正态分布,减少了 Internal Covariate Shift(内部神经元分布的改变)。
BN 的论文指出,传统的深度神经网络在训练时,每一层的输入的分布都在变化,导致训练变得困难,我们只能使用一个很小的学习速率解决这个问题。而对每一层使用 BN 之后,我们就可以有效地解决这个问题,学习速率可以增大很多倍,达到之前的准确率所需要的迭代次数只有1/14,训练时间大大缩短。而达到之前的准确率后,可以继续训练,并最终取得远超于 Inception V1 模型的性能—— top-5 错误率 4.8%,已经优于人眼水平。因为 BN 某种意义上还起到了正则化的作用,所以可以减少或者取消 Dropout 和 LRN,简化网络结构。
Inception V3
一是引入了 Factorization into small convolutions 的思想,将一个较大的二维卷积拆成两个较小的一维卷积,比如将7´7卷积拆成1´7卷积和7´1卷积,或者将3´3卷积拆成1´3卷积和3´1卷积,如上图所示。一方面节约了大量参数,加速运算并减轻了过拟合(比将7´7卷积拆成1´7卷积和7´1卷积,比拆成3个3´3卷积更节约参数),同时增加了一层非线性扩展模型表达能力。论文中指出,这种非对称的卷积结构拆分,其结果比对称地拆为几个相同的小卷积核效果更明显,可以处理更多、更丰富的空间特征,增加特征多样性。
另一方面,Inception V3 优化了 Inception Module 的结构,现在 Inception Module 有35´35、17´17和8´8三种不同结构。这些 Inception Module 只在网络的后部出现,前部还是普通的卷积层。并且 Inception V3 除了在 Inception Module 中使用分支,还在分支中使用了分支(8´8的结构中),可以说是Network In Network In Network。最终取得 top-5 错误率 3.5%。
Inception V4
Inception V4 相比 V3 主要是结合了微软的 ResNet,将错误率进一步减少到 3.08%。
总结:
Inception V1——构建了1x1、3x3、5x5的 conv 和3x3的 pooling 的分支网络,同时使用 MLPConv 和全局平均池化,扩宽卷积层网络宽度,增加了网络对尺度的适应性;
Inception V2——提出了 Batch Normalization,代替 Dropout 和 LRN,其正则化的效果让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅提高,同时学习 VGG 使用两个3´3的卷积核代替5´5的卷积核,在降低参数量同时提高网络学习能力;
Inception V3——引入了 Factorization,将一个较大的二维卷积拆成两个较小的一维卷积,比如将3´3卷积拆成1´3卷积和3´1卷积,一方面节约了大量参数,加速运算并减轻了过拟合,同时增加了一层非线性扩展模型表达能力,除了在 Inception Module 中使用分支,还在分支中使用了分支(Network In Network In Network);
Inception V4——研究了 Inception Module 结合 Residual Connection,结合 ResNet 可以极大地加速训练,同时极大提升性能,在构建 Inception-ResNet 网络同时,还设计了一个更深更优化的 Inception v4 模型,能达到相媲美的性能。
文章主要参考:
https://blog.csdn.net/xbinworld/article/details/45619685
https://blog.csdn.net/maxiao1204/article/details/65653781
https://zhuanlan.zhihu.com/p/37706726
http://lib.csdn.net/article/aimachinelearning/66253