一文读懂最近流行的CNN架构(附学习资料)

卷积神经网络(CNN)在视觉识别任务上的表现使人称奇。好的CNN网络是带有上百万参数和许多隐含层的“庞然怪物”。事实上,一个很差的经验规则是:网络越深,效果越好。网络

AlexNet,VGG,Inception和ResNet是最近一些流行的CNN网络。架构

为何这些网络表现如此之好?它们是如何设计出来的?为何它们设计成那样的结构?回答这些问题并不简单,可是这里咱们试着去探讨上面的一些问题。模块化

网络结构设计是一个复杂的过程,须要花点时间去学习,甚至更长时间去本身动手实验。首先,咱们先来讨论一个基本问题。函数

1. 为何CNN模型打败了传统的计算机视觉方法?学习

efbece952dd94d4db54d4110a24ff15e322872e9

图像分类指的是给定一个图片将其分类成预先定义好的几个类别之一。图像分类的传统流程涉及两个模块:特征提取和分类测试

特征提取指的是从原始像素点中提取更高级的特征,这些特征能捕捉到各个类别间的区别。这种特征提取是使用无监督方式,从像素点中提取信息时没有用到图像的类别标签。优化

经常使用的传统特征包括GIST, HOG, SIFT, LBP等。特征提取以后,使用图像的这些特征与其对应的类别标签训练一个分类模型。经常使用的分类模型有SVM,LR,随机森林及决策树等。编码

上面流程的一大问题是:特征提取不能根据图像和其标签进行调整。若是选择的特征缺少必定的表明性来区分各个类别,模型的准确性就大打折扣,不管你采用什么样的分类策略。设计

采用传统的流程,目前的一个比较好的方法是使用多种特征提取器,而后组合它们获得一种更好的特征。code

可是这须要不少启发式规则和人力来根据领域不一样来调整参数使得达到一个很好的准确度,这里说的是要接近人类水平。

这也就是为何采用传统的计算机视觉技术须要花费多年时间才能打造一个好的计算机视觉系统(如OCR,人脸验证,图像识别,物体检测等),这些系统在实际应用中能够处理各类各样的数据。

有一次,咱们用了6周时间为一家公司打造了一个CNN模型,其效果更好,采用传统的计算机视觉技术要达到这样的效果要花费一年时间。

传统流程的另一个问题是:它与人类学习识别物体的过程是彻底不同的。自从出生之初,一个孩子就能够感知周围环境,随着他的成长,他接触更多的数据,从而学会了识别物体。

这是深度学习背后的哲学,其中并无创建硬编码的特征提取器。它将特征提取和分类两个模块集成一个系统,经过识别图像的特征来进行提取并基于有标签数据进行分类。

这样的集成系统就是多层感知机,即有多层神经元密集链接而成的神经网络。

一个经典的深度网络包含不少参数,因为缺少足够的训练样本,基本不可能训练出一个不过拟合的模型。

可是对于CNN模型,从头开始训练一个网络时你可使用一个很大的数据集如ImageNet。这背后的缘由是CNN模型的两个特色:神经元间的权重共享和卷积层之间的稀疏链接。

这能够从下图中看到。在卷积层,某一个层的神经元只是和输入层中的神经元局部链接,并且卷积核的参数是在整个2-D特征图上是共享的

d2d1357fa32d46d6cdac214b3262c94a0b2010f7

2. 为了理解CNN背后的设计哲学,你可能会问:其目标是什么?

准确度

若是你在搭建一个智能系统,最重要的固然是要尽量地准确。公平地来讲,准确度不只取决于网路,也取决于训练样本数量。所以,CNN模型通常在一个标准数据集ImageNet上作对比。

ImageNet项目仍然在继续改进,目前已经有包含21841类的14,197,122个图片。自从2010年,每一年都会举行ImageNet图像识别竞赛,比赛会提供从ImageNet数据集中抽取的属于1000类的120万张图片。

每一个网络架构都是在这120万张图片上测试其在1000类上的准确度。

计算量

大部分的CNN模型都须要很大的内存和计算量,特别是在训练过程。所以,计算量会成为一个重要的关注点。一样地,若是你想部署在移动端,训练获得的最终模型大小也须要特别考虑。

你能够想象到,为了获得更好的准确度你须要一个计算更密集的网络。所以,准确度和计算量须要折中考虑。

除了上面两个因素,还有其余须要考虑的因素,如训练的容易度,模型的泛化能力等。下面按照提出时间介绍一些最流行的CNN架构,能够看到它们准确度愈来愈高。

3. AlexNet

AlexNet

http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

是一个较早应用在ImageNet上的深度网络,其准确度相比传统方法有一个很大的提高。它首先是5个卷积层,而后紧跟着是3个全链接层,以下图所示:

0704540aa14fcf8082aeea1fde5de84a667f1f9b

Alex Krizhevs提出的AlexNet采用了ReLU激活函数,而不像传统神经网络早期所采用的Tanh或Sigmoid激活函数,ReLU数学表达为:

 

f(x)=max(0, x)

 

ReLU相比Sigmoid的优点是其训练速度更快,由于Sigmoid的导数在稳定区会很是小,从而权重基本上再也不更新。这就是梯度消失问题。所以AlexNet在卷积层和全链接层后面都使用了ReLU。

0130a388c85c398301c01474aa68934c8da205dd

AlexNet的另一个特色是其经过在每一个全链接层后面加上Dropout层减小了模型的过拟合问题。Dropout层以必定的几率随机地关闭当前层中神经元激活值,以下图所示:

ad9608513b881e0ae911532d47f41b3b3f9aa445

为何Dropout有效?

Dropout背后理念和集成模型很类似。在Drpout层,不一样的神经元组合被关闭,这表明了一种不一样的结构,全部这些不一样的结构使用一个的子数据集并行地带权重训练,而权重总和为1。

若是Dropout层有 n 个神经元,那么会造成2^n个不一样的子结构。在预测时,至关于集成这些模型并取均值。这种结构化的模型正则化技术有利于避免过拟合。

Dropout有效的另一个视点是:因为神经元是随机选择的,因此能够减小神经元之间的相互依赖,从而确保提取出相互独立的重要特征。

4. VGG16

VGG16

https://arxiv.org/abs/1409.1556

是牛津大学VGG组提出的。VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,5x5)。

对于给定的感觉野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,由于多层非线性层能够增长网络深度来保证学习更复杂的模式,并且代价还比较小(参数更少)。

好比,3个步长为1的 3x3 卷积核连续做用在一个大小为7的感觉野,其参数总量为 3*(9C^2), 若是直接使用7x7卷积核,其参数总量为 49C^2,这里 C 指的是输入和输出的通道数。

并且3x3卷积核有利于更好地保持图像性质。VGG网络的架构以下表所示:

5c44cd57e5448b2f080bd83772e1ed251e092ef2

能够看到VGG-D,其使用了一种块结构:屡次重复使用同一大小的卷积核来提取更复杂和更具备表达性的特征。这种块结构( blocks/modules)在VGG以后被普遍采用。

VGG卷积层以后是3个全链接层。网络的通道数从较小的64开始,而后每通过一个下采样或者池化层成倍地增长,固然特征图大小成倍地减少。最终其在ImageNet上的Top-5准确度为92.3%。

5. GoogLeNet / Inception

尽管VGG能够在ImageNet上表现很好,可是将其部署在一个适度大小的GPU上是困难的,由于须要VGG在内存和时间上的计算要求很高。因为卷积层的通道数过大,VGG并不高效。

好比,一个3x3的卷积核,若是其输入和输出的通道数均为512,那么须要的计算量为9x512x512。

在卷积操做中,输出特征图上某一个位置,其是与全部的输入特征图是相连的,这是一种密集链接结构。

GoogLeNet

https://arxiv.org/pdf/1409.4842v1.pdf

基于这样的理念:在深度网路中大部分的激活值是没必要要的(为0),或者因为相关性是冗余。所以,最高效的深度网路架构应该是激活值之间是稀疏链接的,这意味着512个输出特征图是没有必要与全部的512输入特征图相连。

存在一些技术能够对网络进行剪枝来获得稀疏权重或者链接。可是稀疏卷积核的乘法在BLAS和CuBlas中并无优化,这反而形成稀疏链接结构比密集结构更慢。

据此,GoogLeNet设计了一种称为inception的模块,这个模块使用密集结构来近似一个稀疏的CNN,以下图所示。

前面说过,只有不多一部分神经元是真正有效的,因此一种特定大小的卷积核数量设置得很是小。同时,GoogLeNet使用了不一样大小的卷积核来抓取不一样大小的感觉野。

76239496e345aa2d2dbb1d47f29835b9fa47251e

Inception模块的另一个特色是使用了一中瓶颈层(实际上就是1x1卷积)来下降计算量:

这里假定Inception模块的输入为192个通道,它使用128个3x3卷积核和32个5x5卷积核。5x5卷积的计算量为25x32x192,可是随着网络变深,网络的通道数和卷积核数会增长,此时计算量就暴涨了。为了不这个问题,在使用较大卷积核以前,先去下降输入的通道数。

因此,Inception模块中,输入首先送入只有16个卷积核的1x1层卷积层,而后再送给5x5卷积层。这样总体计算量会减小为16x192+25x32x16。这种设计容许网络可使用更大的通道数。

(译者注:之因此称1x1卷积层为瓶颈层,你能够想象一下一个1x1卷积层拥有最少的通道数,这在Inception模块中就像一个瓶子的最窄处)

GoogLeNet的另一个特殊设计是最后的卷积层后使用全局均值池化层替换了全链接层,所谓全局池化就是在整个2D特征图上取均值。

这大大减小了模型的总参数量。要知道在AlexNet中,全链接层参数占整个网络总参数的90%。使用一个更深更大的网络使得GoogLeNet移除全链接层以后还不影响准确度。其在ImageNet上的top-5准确度为93.3%,可是速度还比VGG还快。

6. ResNet

从前面能够看到,随着网络深度增长,网络的准确度应该同步增长,固然要注意过拟合问题。可是网络深度增长的一个问题在于这些增长的层是参数更新的信号,由于梯度是从后向前传播的,增长网络深度后,比较靠前的层梯度会很小。

这意味着这些层基本上学习停滞了,这就是梯度消失问题。深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,所以简单地去增长网络深度反而出现更高的训练偏差。

残差网络 [ResNet]

https://arxiv.org/abs/1512.03385

设计一种残差模块让咱们能够训练更深的网络

a58a358098a68ccb5e93ababc2e06e718276fda8

深度网络的训练问题称为退化问题,残差单元能够解决退化问题的背后逻辑在于此:想象一个网络A,其训练偏差为x。

如今经过在A上面堆积更多的层来构建网络B,这些新增的层什么也不作,仅仅复制前面A的输出。这些新增的层称为C。

这意味着网络B应该和A的训练偏差同样。那么,若是训练网络B其训练偏差应该不会差于A。可是实际上倒是更差,惟一的缘由是让增长的层C学习恒等映射并不容易。

为了解决这个退化问题,残差模块在输入和输出之间创建了一个直接链接,这样新增的层C仅仅须要在原来的输入层基础上学习新的特征,即学习残差,会比较容易。

与GoogLeNet相似,ResNet也最后使用了全局均值池化层。利用残差模块,能够训练152层的残差网络。其准确度比VGG和GoogLeNet要高,可是计算效率也比VGG高。152层的ResNet其top-5准确度为95.51%。

ResNet主要使用3x3卷积,这点与VGG相似。在VGG基础上,短路链接插入进入造成残差网络。以下图所示:

77d705acb6d8a2d28efcf26c32ae8bb211023499

残差网络实验结果代表:34层的普通网络比18层网路训练偏差还打,这就是前面所说的退化问题。可是34层的残差网络比18层残差网络训练偏差要好。

7. 总结

随着愈来愈复杂的架构的提出,一些网络可能就流行几年就走下神坛,可是其背后的设计哲学倒是值得学习的。这篇文章对近几年比较流行的CNN架构的设计原则作了一个总结。

(译者注:能够看到,网络的深度愈来愈大,以保证获得更好的准确度。网络结构倾向采用较少的卷积核,如1x1和3x3卷积核,这说明CNN设计要考虑计算效率了。)

一个明显的趋势是采用模块结构,这在GoogLeNet和ResNet中能够看到,这是一种很好的设计典范,采用模块化结构能够减小咱们网络的设计空间,另一个点是模块里面使用瓶颈层能够下降计算量,这也是一个优点。

这篇文章没有提到的是最近的一些移动端的轻量级CNN模型,如MobileNet,SqueezeNet,ShuffleNet等,这些网络大小很是小,并且计算很高效,能够知足移动端需求,是在准确度和速度之间作了平衡。

阅读原文

相关文章
相关标签/搜索