【机器学习】CNN模型:AlexNet、VGG16、GoogLeNet(InceptionV3)、ResNet50、Xception

http://www.mamicode.com/info-detail-2275810.html

【搬运】
图像分类的传统流程涉及两个模块:特征提取(特征能捕捉到各个类别间的区别(特征有一定的代表性),常用的传统特征包括GIST, HOG, SIFT, LBP等。)和分类(SVM,LR,随机森林及决策树等。)。

AlexNet
https://www.cnblogs.com/wangguchangqing/p/10333370.html
AlexNet是一个较早应用在ImageNet上的深度网络,其准确度相比传统方法有一个很大的提升。它首先是5个卷积层,然后紧跟着是3个全连接层
在这里插入图片描述
Alex Krizhevs提出的AlexNet采用了ReLU激活函数,而不像传统神经网络早期所采用的Tanh或Sigmoid激活函数:

ReLU相比Sigmoid的优势是其训练速度更快,因为Sigmoid的导数在稳定区会非常小,从而权重基本上不再更新。这就是梯度消失问题。因此AlexNet在卷积层和全连接层后面都使用了ReLU。

AlexNet的另外一个特点是其通过在每个全连接层后面加上Dropout层减少了模型的过拟合问题。Dropout层以一定的概率随机地关闭当前层中神经元激活值:

在Drpout层,不同的神经元组合被关闭,这代表了一种不同的结构,所有这些不同的结构使用一个的子数据集并行地带权重训练,而权重总和为1。在预测时,相当于集成这些模型并取均值。这种结构化的模型正则化技术有利于避免过拟合。
Dropout有效的另外一个视点是:由于神经元是随机选择的,所以可以减少神经元之间的相互依赖,从而确保提取出相互独立的重要特征。

https://www.cnblogs.com/liaohuiqiang/p/9194699.html
使用dropout来防止过拟合,它起到了一个(和结合多个不同网络)近似的效果

VGG16
http://cs231n.github.io/convolutional-networks/
VGG16是牛津大学VGG组提出的。VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,5x5)。
块结构(blocks/modules):多次重复使用同一大小的卷积核来提取更复杂和更具有表达性的特征。
VGG卷积层之后是3个全连接层。网络的通道数从较小的64开始,然后每经过一个下采样或者池化层成倍地增加,当然特征图大小成倍地减小。最终其在ImageNet上的Top-5准确度为92.3%。

对于给定的感受野【与输出有关的输入图片的局部大小,卷积窗口】,采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且3个3x3卷积核的代价(3x(3x3))还比1个7x7卷积核(1x(7x7))小(参数更少,指的是输入和输出的通道数),且3x3卷积核有利于更好地保持图像性质。
VGG可以在ImageNet上表现很好,但是将其部署在一个适度大小的GPU上是困难的,因为需要VGG在内存和时间上的计算要求很高。(与Inception模块比较)由于卷积层的通道数过大,VGG并不高效。比如,一个3x3的卷积核,如果其输入和输出的通道数均为512,那么需要的计算量为9x512x512。

http://baijiahao.baidu.com/s?id=1601882944953788623&wfr=spider&for=pc
【搬运】VGG-Net 的泛化性能非常好,常用于图像特征的抽取目标检测候选框生成等。VGG 最大的问题就在于参数数量,VGG-19 基本上是参数量最多的卷积网络架构(网络架构weight数量相当大,很消耗磁盘空间;训练非常慢)。这一问题也是第一次提出 Inception 结构的 GoogLeNet 所重点关注的,它没有如同 VGG-Net 那样大量使用全连接网络,因此参数量非常小。

由于VGG全连接节点的数量较多,再加上网络比较深,VGG16有533MB+,VGG19有574MB。这使得部署VGG比较耗时。我们仍然在很多深度学习的图像分类问题中使用VGG,然而,较小的网络架构通常更为理想(例如SqueezeNet、GoogLeNet等)。
在这里插入图片描述

在这里插入图片描述

GoogLeNet/Inception
在卷积操作中,输出特征图上某一个位置,其是与所有的输入特征图是相连的,这是一种密集连接结构。GoogLeNet基于这样的理念:在深度网路中大部分的激活值是不必要的(为0),或者由于相关性是冗余。因此,最高效的深度网路架构应该是激活值之间是稀疏连接的,这意味着512个输出特征图是没有必要与所有的512输入特征图相连。存在一些技术可以对网络进行剪枝来得到稀疏权重或者连接。但是稀疏卷积核的乘法在BLAS和CuBlas中并没有优化,这反而造成稀疏连接结构比密集结构更慢。
据此,GoogLeNet设计了一种称为Inception的模块,这个模块使用密集结构来近似一个①稀疏的CNN,如下图所示。前面说过,只有很少一部分神经元是真正有效的,所以一种特定大小的卷积核数量设置得非常小。同时,GoogLeNet使用了②不同大小的卷积核来抓取不同大小的感受野。

Inception模块的另外一个特点是使用了瓶颈层(实际上就是③1x1卷积)来降低计算量:【 https://www.davex.pw/2018/02/05/breadcrumbs-about-inception-xception/#Summary Pointwise Convolution,俗称叫做 1x1 卷积,简写为 PW,主要用于数据降维,减少参数量。也有使用 PW 做升维的,在 MobileNet v2 中就使用 PW 将 3 个特征图变成 6 个特征图,丰富输入数据的特征。】

这里假定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还快。

http://baijiahao.baidu.com/s?id=1601882944953788623&wfr=spider&for=pc
【搬运】一文概览Inception家族的「奋斗史」
GoogLeNet 最大的特点就是使用了 Inception 模块,它的目的是设计一种具有优良局部拓扑结构的网络,即对输入图像并行地执行多个卷积运算或池化操作,并将所有输出结果拼接为一个非常深的特征图。因为 1x1、3x3 或 5x5 等不同的卷积运算与池化操作可以获得输入图像的不同信息,并行处理这些运算并结合所有结果将获得更好的图像表征。
另一方面,Inception 网络是复杂的(需要大量工程工作)。它使用大量 trick 来提升性能,包括速度和准确率两方面。它的不断进化带来了多种 Inception 网络版本的出现。常见的版本有:
Inception v1
Inception v2 和 Inception v3
Inception v4 和 Inception-ResNet
每个版本都是前一个版本的迭代进化。了解 Inception 网络的升级可以帮助我们构建自定义分类器,优化速度和准确率。此外,根据你的已有数据,或许较低版本工作效果更好。
原始 Inception 模块:
原始 Inception 模块
实现降维的 Inception 模块:【XR思考:重点关注1x1卷积发挥降维作用】
实现降维的 Inception 模块

ResNet
从前面可以看到,随着网络深度增加,网络的准确度应该同步增加,当然要注意过拟合问题。但是网络深度增加的一个问题在于这些增加的层是参数更新的信号,因为梯度是从后向前传播的,增加网络深度后,比较靠前的层梯度会很小。这意味着这些层基本上学习停滞了,这就是梯度消失问题。深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,因此简单地去增加网络深度反而出现更高的训练误差。 残差网络ResNet设计一种残差模块让我们可以训练更深的网络。

深度网络的训练问题称为退化问题,残差单元可以解决退化问题的背后逻辑在于此:想象一个网络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基础上,②短路连接插入进入形成残差网络。如下图所示:
https://www.jianshu.com/p/93990a641066
在这里插入图片描述
在这里插入图片描述

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

与传统的顺序网络架构(如AlexNet、OverFeat和VGG)不同,其加入了y=x层(恒等映射层),可以让网络在深度增加情况下却不退化。下图展示了一个构建块(build block),输入经过两个weight层,最后和输入相加,形成一个微架构模块。ResNet最终由许多微架构模块组成。
在这里插入图片描述

bottleneck构建模块
https://www.jianshu.com/p/93990a641066
为了实际计算的考虑,作者提出了一种bottleneck的结构块来代替常规的Resedual block,它像Inception网络那样通过使用1x1 conv来巧妙地缩减或扩张feature map维度从而使得我们的3x3 conv的filters数目不受外界即上一层输入的影响,自然它的输出也不会影响到下一层module。
Bottleneck模块:
在这里插入图片描述
不过它纯是为了节省计算时间进而缩小整个模型训练所需的时间而设计的,对最终的模型精度并无影响。

http://www.mamicode.com/info-detail-2275810.html

随着越来越复杂的架构的提出,一些网络可能就流行几年就走下神坛,但是其背后的设计哲学却是值得学习的。这篇文章对近几年比较流行的CNN架构的设计原则做了一个总结。译者注:可以看到,网络的深度越来越大,以保证得到更好的准确度。网络结构倾向采用较少的卷积核,如1x1和3x3卷积核,这说明CNN设计要考虑计算效率了。一个明显的趋势是采用模块结构,这在GoogLeNet和ResNet中可以看到,这是一种很好的设计典范,采用模块化结构可以减少我们网络的设计空间,另外一个点是模块里面使用瓶颈层可以降低计算量,这也是一个优势。这篇文章没有提到的是最近的一些移动端的轻量级CNN模型,如MobileNet,SqueezeNet,ShuffleNet等,这些网络大小非常小,而且计算很高效,可以满足移动端需求,是在准确度和速度之间做了平衡。

Xception

https://blog.csdn.net/u014380165/article/details/75142710
Xception作为Inception v3的改进,主要是在Inception v3的基础上引入了depthwise separable convolution(深度可分离卷积 ),在基本不增加网络复杂度的前提下提高了模型的性能。

https://blog.csdn.net/lk3030/article/details/84847879
Xception(极致的 Inception):先进行普通卷积操作,再对 1×1 卷积后的每个channel分别进行 3×3 卷积操作,最后将结果 concat:
在这里插入图片描述
Xception 网络架构
Xception 的结构基于 ResNet,但是将其中的卷积层换成了Separable Convolution(极致的 Inception模块)。如下图所示。整个网络被分为了三个部分:Entry,Middle和Exit。
在这里插入图片描述

http://www.mamicode.com/info-detail-2275810.html
https://www.pyimagesearch.com/2017/03/20/imagenet-vggnet-resnet-inception-xception-keras/
【代码】用Python和上述Keras库来给图像分类

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值