1.Alexnet

Alexnet是2012年发表的,是在imageNet 1000种分类上做图片分类的
在该文中提出了dropout的概念
Top1和Top5的错误率分别是37%和17%。
其网络架构非常简单,包含8层—5个卷积层+3个全连接层。
强调了relu激活的好处,计算速度比sigmoid快多了,由下面这幅图可以看出来:
下降到0.25的错误率所需要的迭代次数,使用relu要快多了

同时这里还应用了归一化,并强调了归一化的好处,归一化将我们的top-1和top-5错误率降低了1.4%和1.2%
同时,这里还介绍了重叠池化,我们将s=步长,zz是池化核的大小,如果s<z,那就是重叠池化(overlapping Pooling)
,重叠的池化(s=2,z=3)比普通的池化top1核top5的错误率下降了0.4%核0.5%,而且我们发现重叠池化更不容易过拟合。
以下是它的网络结构图(这个图比较清晰一点):

以下是原文上的图(个人感觉看上去不是很清晰):

其中第一层卷积是11
11的卷积核,第二层是55的卷积核,后面3层卷积都是33的卷积核。
该模型有6000万的参数,由于有1000个分类,事实证明是需要这么多的参数,那么这么多参数如何防止过拟合呢?
数据增强的第一种形式有图像平移和水平反射(我理解的就是左右像素对调)数据增强的第二种形式包括更改RGB通道的强度。在相对较小的数据集上训练的大型神经网络可能会过度拟合训练数据。减少过度拟合的一种方法是将所有可能的不同神经网络拟合在同一数据集上,并对每个模型的预测求平均。Dropout能够有效地减少过拟合带来的影响。结合多个模型来预测可以有效地降低错误率,但是对于大型的网络来说需要花费好几天的时间进行训练,针对这个问题,dropout是一个好办法,也就是将隐藏层的神经元50%的可能性设置为0,被设置的参数在不会对前向传播造成贡献,也不会出现在后向传播当中,可以让单个神经元不用对其他神经元产生依赖,逼迫该神经元学习更全面的特征。
训练的一些细节:
我们从零均值高斯分布(标准差为0.01)初始化每一层的权重。我们在第二,第四和第五卷积层中初始化了神经元偏差,
以及完全连接的隐藏层中的常数1。此初始化加快了向ReLU提供积极的投入,从而在学习的早期阶段。我们初始化了神经元
其余层的偏差为常数0。我们对所有层使用了相等的学习率,在整个训练过程中我们手动进行了调整,在学习的过程中动态地调整了学习率。dropout是一种正则化方法,它近似并行地训练大量具有不同架构的神经网络。当数据量比较小的时候,使用dropout防止过拟合是一个非常好的办法,但是当数据量很大的时候,使用dropout的受益则比较小。
关于dropout的实现,以下为我的个人理解:
(1)训练阶段,以一定概率p使部分神经元失效,训练一定epoch后,再重新选取一些神经元失效进行训练,以此重复
(2)测试阶段 所有的神经元都work,且乘上之前被放大的概率(1/(1-p)),这就相当于全连接层训练了多个模型,结果为相加求平均。
值得注意,如果移除单个卷积层,我们的网络性能就会下降。例如,,删除任何中间层会导致前1个性能下降约2%网络。因此深度对于实现我们的结果确实很重要。为了简化我们的实验,即使我们期望,我们也没有使用任何无监督的预训练这将有所帮助,特别是如果我们获得足够的计算能力来显着提高网络的大小,而未获得标记数据量的相应增加。从而到目前为止,随着网络规模的扩大和培训时间的延长,我们的结果有所改善。

2.VGG

VGG有两种结构,分别是VGG16和VGG19,两者并没有本质上的区别,只是网络深度不一样。
以下为VGG的网络结构:

  • VGG16包含了16个隐藏层(13个卷积层和3个全连接层),如上图中的D列所示
  • VGG19包含了19个隐藏层(16个卷积层和3个全连接层),如上图中的E列所示
    VGG网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2的max pooling。
    跟Alexnet相比,VGG最大的特点就是:1.加深了网络;2.全部使用3*3的卷积核(因为用两个3*3卷积核参数比一个5*5的卷积核参数少,但是感受野更大
    但是VGG三个全连接层消耗的参数特别多,有论文说这三个全连接层去掉对性能影响不大。
    论文的最后一句说的是:我们的结果再次证实了深度的重要性在视觉上表现。说明在不考虑耗时的情况下,网络模型确实越深越好。

3.Resnet

我们已经测试了各种普通/残差网络,并观察到了一致的现象。为了提供讨论实例,我们描述了ImageNet的两个模型,如下所示。主要是受VGG网络原理的启发,卷积层主要具有3×3滤镜和遵循两个简单的设计规则:(i)对于相同的输出
要素图大小时,图层具有相同数量的过滤器; (ii)如果特征图的大小减半,则过滤器的数量将增加一倍,以保持每层的时间复杂度。我们直接执行降采样跨度为2的卷积层。网络以全局平均池化层和1000路为结尾softmax的全连接层。总数加权层在图3中为34(中)。值得注意的是,我们的模型具有较少的过滤器和比VGG网络要低[41](图3,左)。我们的34-层基线具有36亿个FLOP(乘法加法),其中仅占VGG-19(196亿FLOP)的18%
ResNets要解决的是深度神经网络的“退化”问题。
什么是“退化”?
我们知道,对浅层网络逐渐叠加layers,模型在训练集和测试集上的性能会变好,因为模型复杂度更高了,表达能力更强了,可以对潜在的映射关系拟合得更好。而“退化”指的是,给网络叠加更多的层后,性能却快速下降的情况。
训练集上的性能下降,可以排除过拟合,BN层的引入也基本解决了plain net的梯度消失和梯度爆炸问题。如果不是过拟合以及梯度消失导致的,那原因是什么?
按道理,给网络叠加更多层,浅层网络的解空间是包含在深层网络的解空间中的,深层网络的解空间至少存在不差于浅层网络的解,因为只需将增加的层变成恒等映射,其他层的权重原封不动copy浅层网络,就可以获得与浅层网络同样的性能。更好的解明明存在,为什么找不到?找到的反而是更差的解?
显然,这是个优化问题,反映出结构相似的模型,其优化难度是不一样的,且难度的增长并不是线性的,越深的模型越难以优化。
有两种解决思路,一种是调整求解方法,比如更好的初始化、更好的梯度下降算法等;另一种是调整模型结构,让模型更易于优化——改变模型结构实际上是改变了error surface的形态。
ResNet的作者从后者入手,探求更好的模型结构。将堆叠的几层layer称之为一个block,对于某个block,其可以拟合的函数为F(x),如果期望的潜在映射为H(x),与其让F(x) 直接学习潜在的映射,不如去学习残差H(x)−x,即F(x):=H(x)−x,这样原本的前向路径上就变成了F(x)+x,用F(x)+x来拟合H(x)。作者认为这样可能更易于优化,因为相比于让F(x)学习成恒等映射,让F(x)学习成0要更加容易——后者通过L2正则就可以轻松实现。这样,对于冗余的block,只需F(x)→0就可以得到恒等映射,性能不减。
F(x)+x构成的block称之为Residual Block,即残差块,如下图所示,多个相似的Residual Block串联构成ResNet。

图中的⊕为element-wise addition,要求参与运算的F(x)和x的尺寸要相同。
残差路径可以大致分成2种,一种有bottleneck结构,即下图右中的1×1 卷积层,用于先降维再升维,主要出于降低计算复杂度的现实考虑,称之为“bottleneck block”,另一种没有bottleneck结构,如下图左所示,称之为“basic block”。basic block由2个3×3卷积层构成。


shortcut路径大致也可以分成2种,取决于残差路径是否改变了feature map数量和尺寸,一种是将输入x原封不动地输出,另一种则需要经过1×1卷积来升维 or/and 降采样,主要作用是将输出与F(x)路径的输出保持shape一致,对网络性能的提升并不明显,两种结构如下图所示:

至于Residual Block之间的衔接,在原论文中,F(x)+x经过ReLU后直接作为下一个block的输入x。
ResNet为多个Residual Block的串联,下面直观看一下ResNet-34与34-layer plain net和VGG的对比,以及堆叠不同数量Residual Block得到的不同ResNet。


在没有shortcut的情况下,我们发现了更深的网络会发生退化问题,如下图所示(plain是没有shortcut的网络):


作者对于plain18和plain34的结果现象进行了猜测解释,作者观察了梯度,认为不是由于梯度消失引起的,且plain34也仍然有比较好的结果,证明网络是work的,作者认为之所以造成plain34低于plain18的精度的原因,是因为深层网络的收敛速度比较慢,相同的epoch训练影响了最终的结果。(说明更深的网络需要更深的epoch来训练)
ResNet的设计有如下特点:
与plain net相比,ResNet多了很多“旁路”,即shortcut路径,其首尾圈出的layers构成一个Residual Block;
ResNet中,所有的Residual Block都没有pooling层,降采样是通过conv的stride实现的(步长为2的stride);
分别在conv3_1、conv4_1和conv5_1 Residual Block,降采样1倍,同时feature map数量增加1倍,如图中虚线划定的block;
通过Average Pooling得到最终的特征,而不是通过全连接层;
每个卷积层之后都紧接着BatchNorm layer,为了简化,图中并没有标出;
ResNet结构非常容易修改和扩展,通过调整block内的channel数量以及堆叠的block数量,就可以很容易地调整网络的宽度和深度,来得到不同表达能力的网络,而不用过多地担心网络的“退化”问题,只要训练数据足够,逐步加深网络,就可以获得更好的性能表现。
下面为网络的性能对比:

上面的实验说明,不断地增加ResNet的深度,甚至增加到1000层以上,也没有发生“退化”,可见Residual Block的有效性。ResNet的动机在于认为拟合残差比直接拟合潜在映射更容易优化,下面通过绘制error surface直观感受一下shortcut路径的作用:

可以发现:

ResNet-20(no short)浅层plain net的error surface还没有很复杂,优化也会很困难,但是增加到56层后复杂程度极度上升。对于plain net,随着深度增加,error surface 迅速“恶化”;
引入shortcut后,error suface变得平滑很多,梯度的可预测性变得更好,显然更容易优化;
关于shortcut,作者尝试了三种方式: (A) zero-padding shortcuts are used for increasing dimensions, and all shortcuts are parameterfree (the same as Table 2 and Fig. 4 right); (B) projection shortcuts are used for increasing dimensions, and other
shortcuts are identity; and © all shortcuts are projections.
结果如下图所示:

可以看出三种方式都比plain好,其中C方式最好。也可以看出resNet152效果最好,最深的网络效果最好。
其中要注意的是,shortcut最重要的没有增加网络的复杂度,看下面图,左边是普通的残差模块,右边是bottleNeck:

bottleNeck适合用于更深的网络结构中.
以下是ResNet用在CIFAR数据集上的效果(我们使用0.0001的权重衰减和0.9的动量,并在BN 中采用权重初始化,但是
没有dropout。这些模型在两个GPU上以最小批量为128进行训练。我们从学习开始速率为0.1,在32k和48k迭代中将其除以10,然后以64k迭代终止训练,可以看)出Resnet110效果最好,所以也不是网络越深越好,要在一定范围内才是,因为在1000多层的情况下我们可以认为是过度拟合,任务并不需要如此大量的参数,如果不结合正则化和dropout等减少参数的方式,结果可能不如较浅一点的网路。
我们进一步探索n = 110层 ResNet。在这种情况下,我们发现初始学习率的0.1太大了,无法开始收敛,所以我们用
0.01以预热训练(确实有这种情况,如果一开始学习率较大,后面即使迭代降低学习率也无法收敛)
关于残差网络为什么可以解决深度网络退化的问题,可以参照:https://zhuanlan.zhihu.com/p/80226180

4.DenseNet

最近一两年卷积神经网络提高效果的方向,要么深(比如ResNet,解决了网络深时候的梯度消失问题)要么宽(比如GoogleNet的Inception),而作者则是从feature入手,通过对feature的极致利用达到更好的效果和更少的参数。
DenseNe的优点如下:
1、减轻了vanishing-gradient(梯度消失)
2、加强了feature的传递
3、更有效地利用了feature
4、一定程度上较少了参数数量
denseNet是当前层要与之前的每一层相连。

与resnet不同的是,以下是resNet的公式:

如图所示(DenseNet的公式),第i层的输入不仅与i-1层的输出相关,还有所有之前层的输出有关.记作:

而且在resnet当中short cut是直接相加,在densenet当中是contate,这需要特征图的大小相同才能contate,这就限制了网络中Down sampling的实现.为了使用Down sampling,作者将DenseNet分为多个Denseblock,如下图所示:

DenseNet的一个优点是网络更窄,参数更少,很大一部分原因得益于这种dense block的设计,后面有提到在dense block中每个卷积层的输出feature map的数量都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度。同时这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。前面提到过梯度消失问题在网络深度越深的时候越容易出现,原因就是输入信息和梯度信息在很多层之间传递导致的,而现在这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题。
为了使contate后的channel不要太大,可以在卷积前先加一个1*1的卷积降低通道(bottleneck).
再来说说transition layer,transition layer有个参数reduction(范围是0到1),表示将这些输出缩小到原来的多少倍,默认是0.5,这样传给下一个Dense Block的时候channel数量就会减少一半,这就是transition layer的作用。文中还用到dropout操作来随机减少分支,避免过拟合,毕竟这篇文章的连接确实多。
以下是实验结果:
这个表中的k=32,k=48中的k是growth rate,表示每个dense block中每层输出的feature map个数。

nseNet-BC和ResNet在Imagenet数据集上的对比,左边那个图是参数复杂度和错误率的对比,你可以在相同错误率下看参数复杂度,也可以在相同参数复杂度下看错误率,提升还是很明显的!右边是flops(可以理解为计算复杂度)和错误率的对比,同样有效果。
Figure4也很重要。左边的图表示不同类型DenseNet的参数和error对比。中间的图表示DenseNet-BC和ResNet在参数和error的对比,相同error下,DenseNet-BC的参数复杂度要小很多。右边的图也是表达DenseNet-BC-100只需要很少的参数就能达到和ResNet-1001相同的结果。
该文章提出的DenseNet核心思想在于建立了不同层之间的连接关系,充分利用了feature,进一步减轻了梯度消失问题,加深网络不是问题,而且训练效果非常好。另外,利用bottleneck layer,Translation layer以及较小的growth rate使得网络变窄,参数减少,有效抑制了过拟合,同时计算量也减少了。DenseNet优点很多,而且在和ResNet的对比中优势还是非常明显的。

4.googleNet

googleNet主要采用Inception模块加深了网络,使用不同大小的卷积核加宽了的网络。
以下是Inception的基本模块:

如果这样contate之后通道数会很大,所以可以在卷积前先用11的卷积降通道,如下图所示(inception v1):

使用1
1的卷积后,卷积消耗的参数量大大降低,inception构成的googlenet如下图所示:
对上图说明如下:
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全连接,但是网络中依然使用了Dropout ;
(4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。
关于inceptionV2的改进的,任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代。GoogLeNet团队发现在网络的前期使用这种分解效果并不好,在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)。此外,两个33的卷积核比一个55的卷积核拥有更大的感受野和更少的参数。


先池化再作Inception卷积,或者先作Inception卷积再作池化。但是方法一(左图)先作pooling(池化)会导致特征表示遇到瓶颈(特征缺失),方法二(右图)是正常的缩小,但计算量很大。为了同时保持特征表示且降低计算量,将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)。

Inception V4主要利用残差连接(Residual Connection)来改进V3结构,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络。

通过20个类似的模块组合,Inception-ResNet构建如下:

6.MobileNet

MobileNet主要是引入了可分离卷积。
什么是可分离卷积?
以下三张图可以说明:



关于深度可分离卷积还可以参考博客:
https://blog.csdn.net/weixin_39326879/article/details/105514182

深度学习中常用的骨干网络介绍相关推荐

  1. 万字长文带你看尽深度学习中的各种卷积网络

    来源:AI科技评论 摘要:深度学习中的各种卷积网络大家知多少? 深度学习中的各种卷积网络大家知多少?对于那些听说过却又对它们没有特别清晰的认识的小伙伴们,这篇文章非常值得一读.Kunlun Bai 是 ...

  2. 【AI初识境】深度学习中常用的损失函数有哪些?

    这是专栏<AI初识境>的第11篇文章.所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法. 今天来说说深度学习中常见的损失函数(loss),覆盖分类,回归任务以及生成对抗网络,有了目 ...

  3. Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解

    Keras深度学习实战(4)--深度学习中常用激活函数和损失函数详解 常用激活函数 Sigmoid 激活函数 Tanh 激活函数 ReLU 激活函数 线性激活函数 Softmax 激活函数 损失函数 ...

  4. 深度学习中的生成对抗网络GAN

    转载:一文看尽深度学习中的生成对抗网络 | CVHub带你看一看GANs架构发展的8年 (qq.com) 导读 生成对抗网络 (Generative Adversarial Networks, GAN ...

  5. DL之AF:机器学习/深度学习中常用的激活函数(sigmoid、softmax等)简介、应用、计算图实现、代码实现详细攻略

    DL之AF:机器学习/深度学习中常用的激活函数(sigmoid.softmax等)简介.应用.计算图实现.代码实现详细攻略 目录 激活函数(Activation functions)相关配图 各个激活 ...

  6. 深度学习中常用的误差方法

    深度学习中常用的误差方法有: 标准差(Standard Deviation): 标准差也叫均方差,是方差的算术平方根,反应数据的离散程度 ,标准差越小,数据偏离平均值越小,反之亦然 . 公式为: py ...

  7. 深度学习中常用的标注文件

    深度学习中常用的标注文件 mat mat文件是matlab专用的文件,第一次见是再COCOstuff-10k数据集中. 遇到的问题:如果用sublime打开的话,会显示16进制格式,可以猜想matla ...

  8. 深度学习中常用的优化算法(SGD, Nesterov,Adagrad,RMSProp,Adam)总结

    深度学习中常用的优化算法(SGD, Nesterov,Adagrad,RMSProp,Adam)总结 1. 引言 在深度学习中我们定义了损失函数以后,会采取各种各样的方法来降低损失函数的数值,从而使模 ...

  9. yolo-mask的损失函数l包含三部分_【AI初识境】深度学习中常用的损失函数有哪些?...

    这是专栏<AI初识境>的第11篇文章.所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法. 今天来说说深度学习中常见的损失函数(loss),覆盖分类,回归任务以及生成对抗网络,有了目 ...

最新文章

  1. 用java建一个类_利用JAVA创建一个类。
  2. Nature发表新研究,用“光”加速人工智能 | AI日报
  3. MySQL · 捉虫动态 · show binary logs 灵异事件
  4. UPS技术培训系统方案
  5. Spring3.2.4集成quartz2.2.1定时任务(demo).
  6. java执行程序默认多线程吗_Java多线程 执行程序(1)
  7. L1-020 帅到没朋友 (20 分) — 团体程序设计天梯赛
  8. Spring mvc mybatis cxf Add CGLIB to your classpath. 错误
  9. R语言及其IDE(RStudio)下载安装流程
  10. opencv打开本地文件.avi提示找不到xvidcore.dll
  11. 阿里云商标注册入口(附商标申请流程)
  12. python3爬取网易云歌曲,利用python3爬取网易云周杰伦所有专辑,歌曲,评论,并完成可视-站长资讯中心...
  13. 北京智源人工智能研究院(BAAI)前沿报告——强化学习领域
  14. “木兰”致歉背后的思考,为什么物联网也能用Python
  15. Lenovo system x3500 m5 安装显卡
  16. 万能表单php设计思路,在线自定义万能表单的设计思路
  17. https://imgsa.baidu.com/forum/pic/item/...【贴吧图床】
  18. 区间dp入门——总结+习题+解析
  19. 二、C++反作弊对抗实战 (进阶篇 —— 16.如何实现游戏加速瞬移与对抗)
  20. python 求斐波那契数列第k项

热门文章

  1. 目标检测算法之YOLO
  2. 中南民族大学计算机科学与技术学院,中南民族大学计算机科学技术学院介绍
  3. 中国收缩隧道行业市场供需与战略研究报告
  4. Python提示unindent does not match any outer indentation level处理方法
  5. 《惢客创业日记》2018.12.11(周二) 创业者从0到1的10个阶段(二)
  6. linux电脑每天定时重启命令,linux的定时重启的具体命令
  7. vb.net 教程 1-1 从 hello world 开始
  8. 想要学好C++,必看,能看完,证明你有学习C++的潜质,否则趁早放弃。
  9. Linux如何打开cp2k,centos7安装并行版cp2k6.1-POPT
  10. RK808去掉低于3.5V关机