经典深度学习模型发展

1、简介

AlexNet:(2012)主要贡献扩展 LeNet 的深度,并应用一些 ReLU、Dropout 等技巧。AlexNet 有 5 个卷积层和 3 个最大池化层,它可分为上下两个彻底相同的分支,这两个分支在第三个卷积层和全链接层上能够相互交换信息。它是开启了卷积神经网络作图像处理的先河。网络

VGG-Net:2014年。该网络使用3×3卷积核的卷积层堆叠并交替最大池化层,有两个4096维的全链接层,而后是softmax分类器。16和19分别表明网络中权重层的数量。相比于 AlexNet 有更小的卷积核和更深的层级。VGG 最大的问题就在于参数数量,VGG-19 基本上是参数量最多的卷积网络架构。架构

ResNet:2015年。该网络使用残差模块来组成更复杂的网络(网络中的网络),使用标准随机梯度降低法训练。与VGG相比,ResNet更深,可是因为使用全局平均池操做而不是全链接密集层,因此模型的尺寸更小。app

Inception:2015年。它没有如同 VGG-Net 那样大量使用全链接网络,所以参数量很是小。增长了网络的深度的同时也增长了网络的宽度,该网络使用不一样大小的卷积核提取特征,同时计算1×一、3×三、5×5卷积,而后分别把他们的结果concatenate(不一样卷积操做输出的feature map的大小要相同),而后将这些滤波器的输出沿通道维度堆叠并传递到下一层。由于 1*一、3*3 或 5*5 等不一样的卷积运算与池化操做能够得到输入图像的不一样信息,并行处理这些运算并结合全部结果将得到更好的图像表征。问题是计算量太大。框架

Inception v1:论文:Going deeper with convolutions分布式

Inception v2ide

Inception v3函数

Inception v4性能

Inception-v4编写于2016年学习

Inception-ResNet测试

Xception:2016年。该网络是Inception网络的扩展,使用了深度可分离卷积运算。其参数数量与Inception-v3相同,因为更高效地利用模型参数,该网络性能得到提高并在大型图像分类数据集赛过Inception-v3。

VGG

vgg的最主要的思想就是增长网络深度,减少卷积核尺寸(3*3)。减小卷积核的好处就是能够减小参数和计算量,好比,论文中举了一个例子,把一个7*7的卷积层替换成3个3*3的卷积层,参数上能够减小81%,由于3*3*3 = 27, 7*7 = 49.

文中还提到了1*1的卷积层,好比说下图的configC的conv1层,这样作的目的主要是增长卷积层的非线性表达,同时影响卷积层的感觉野,这个思想在google的inception系列网络中有了很好的应用,具体能够参考Network in Network这篇论文。

vgg的参数仍是不少的,能够看出vgg-16有138百万个参数。

incception系列

参考论文:
[v1] Going Deeper with Convolutions, 6.67% test error
[v2] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, 4.8% test error
[v3] Rethinking the Inception Architecture for Computer Vision, 3.5% test error
[v4] Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning, 3.08% test error

在 Inception 出现以前,大部分流行 CNN 仅仅是把卷积层堆叠得愈来愈多,使网络愈来愈深,以此但愿可以获得更好的性能。

inception-v1

这个就是GoogleNet,本文的主要工做,就是研究怎么设计一种网络,更加有效地利用计算资源。

  • 因为信息位置的巨大差别,为卷积操做选择合适的卷积核大小就比较困难。信息分布更全局性的图像偏好较大的卷积核,信息分布比较局部的图像偏好较小的卷积核。
  • 很是深的网络意味着巨量的参数,同时更容易过拟合。将梯度更新传输到整个网络是很困难的。
  • 简单地堆叠较大的卷积层很是消耗计算资源。所以inception-v1并无在网络的深度上作文章而是在网络的宽度上。

  文章认为解决上述两个缺点的根本方法是将全链接甚至通常的卷积都转化为稀疏链接。一方面现实生物神经系统的链接也是稀疏的,另外一方面有文献代表:对于大规模稀疏的神经网络,能够经过分析激活值的统计特性和对高度相关的输出进行聚类来逐层构建出一个最优网络。这点代表臃肿的稀疏网络可能被不失性能地简化。 

  早些的时候,为了打破网络对称性和提升学习能力,传统的网络都使用了随机稀疏链接。可是,计算机软硬件对非均匀稀疏数据的计算效率不好,因此在AlexNet中又从新启用了全链接层,目的是为了更好地优化并行运算

  因此,如今的问题是有没有一种方法,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能大量的文献代表能够将稀疏矩阵聚类为较为密集的子矩阵来提升计算性能,据此论文提出了名为Inception 的结构来实现此目的。

inception module 

  主要就是把稀疏结构近似成几个密集的子矩阵,从而在减小参数的同时,更加有效地利用计算资源。

  1. 采用不一样大小的卷积核意味着不一样大小的感觉野,最后拼接意味着不一样尺度特征的融合;
  2. 之因此卷积核大小采用一、3和5,主要是为了方便对齐。设定卷积步长stride=1以后,只要分别设定pad=0、一、2,那么卷积以后即可以获得相同维度的特征,而后这些特征就能够直接拼接在一块儿了;
  3. 文章说不少地方都代表pooling挺有效,因此Inception里面也嵌入了。
  4. 网络越到后面,特征越抽象,并且每一个特征所涉及的感觉野也更大了,所以随着层数的增长,3x3和5x5卷积的比例也要增长。

  可是,这种naive的inception 并不实用,由于不一样的feature map拼到一块儿以后传递到下一层inception 的5*5卷积层,计算量仍然是很是巨大的,为了下降算力成本,做者在 3x3 和 5x5 卷积层以前添加额外的1*1的卷积层(bottleneck)降维操做,下面是改进以后的inception。注意,1x1 卷积是在最大池化层以后。

降维Inception模块

此时这一个Inception module的计算量为358M ops,相比以前的854M ops,使用“bottleneck”的Inception module的计算量下降了一半多!

  到这里,Inception module的结构就介绍完了,而GoogLeNet的架构就是多个Inception module一层一层地stack(堆叠)出来的,下面是GoogLeNet的总体架构的介绍。

注:浅蓝色部分Stem Network是一些初始卷积,深蓝色部分有三个辅助分类器,为何要用三个classifier呢?结合GoogLeNet的论文,我我的认为有如下几点缘由:

  • 通常认为深度越深,越有可能产生梯度消失的问题。这里深度不一样的三个classifier能够有效缓解梯度消失问题,即浅层的classifier的输出也执行 softmax 操做,而后在一样的标签上计算辅助损失。总损失即辅助损失和真实损失的加权和。该论文中对每一个辅助损失使用的权重值是 0.3。可见辅助分类器也能够回传偏差,缓解梯度消失问题。辅助损失只是用于训练,在推断过程当中并不使用。
  • CNN深度越深的层,提取的特征语义信息越丰富,深度越浅的层提取的特征更基础,包含更多的位置信息,因此并非深度越深的层提取的特征必定好于较浅层提取的特征。这里在不一样深度的层上面都加了一个output layer,能够作一个模型的ensemble,这可能会提高模型的效果。

Network in Network

NIN有两个特性,是它对CNN的贡献:

  1. MLP代替GLM
  2. Global Average Pooling

MLPconv

普通的卷积能够看作输入feature map 和kernel 矩阵相乘的过程,是一个线性变换。MLP是指多层感知机,因为是多层的,f(x) = w*g(x)+b, g(x) = w*x +b,输出f和输入x天然是非线性关系,mlpconv的意思就是用mlp代替普通卷积,能够增长网络的抽象表达能力。

因此,基于如上,能够认为,在抽特征的时候直接作了非线性变换,能够有效的对图像特征进行更好的抽象。

从而,Linear convolution layer就变成了Mlpconv layer。

值得一提的是,Mlpconv至关于在激活函数后面,再添加一个1×1的卷积层。
固然,1*1卷积层在本文中的最重要的做用仍是进行降维。

Global Average Pooling

Global Average Pooling的作法是将全链接层去掉。

全链接层的存在有两个缺点:

全链接层是传统的神经网络形式,使用了全链接层觉得着卷积层只是做为特征提取器来提取图像的特征,而全链接层是不可解释的,从而CNN也不可解释了
全链接层中的参数每每占据CNN整个网络参数的一大部分,从而使用全链接层容易致使过拟合。
而Global Average Pooling则是在最后一层,将卷积层设为与类别数目一致,而后全局pooling,从而输出类别个数个结果。

可是本文中,在average pooling 后面还跟了一个linear layer,加这个层主要是为了方便起见,可以更容易扩展到其余的数据集上。
作后的结构如图所示:

网络在训练的时候还加了两个额外的分类器,目的是为了防止梯度消失,最后测试的时候能够把这两个分类器去掉。
最后的参数相比于alexnet少了12倍,相比于vgg-16来讲少了3倍。

Inception v2 和 Inception v3 来自同一篇论文《Rethinking the Inception Architecture for Computer Vision》,做者提出了一系列能增长准确度和减小计算复杂度的修正方法。

inception-v2

问题:

  1. 减小特征的表征性瓶颈。直观上来讲,当卷积不会大幅度改变输入维度时,神经网络可能会执行地更好。过多地减小维度可能会形成信息的损失,这也称为「表征性瓶颈」。
  2. 使用更优秀的因子分解方法,卷积才能在计算复杂度上更加高效。

解决方案:

  1. 将7*7和 5×5 的卷积分解为两个 3×3 的卷积运算以提高计算速度。尽管这有点违反直觉,但一个 5×5 的卷积在计算成本上是一个 3×3 卷积的 2.78 倍。因此叠加两个 3×3 卷积实际上在性能上会有所提高
  2. 在 Inception-V1的基础上增长了 Batch Normalization 

主要贡献:提出了batch normalization,主要在于加快训练速度。数据归一化方法很简单,就是要让数据具备0均值和1方差

网络训练的过程参数不断的改变致使后续每一层输入的的分布也发生改变,而学习的过程又要使每一层适应输入的分布,所以咱们不得不下降学习率、当心地初始化。做者将分布发生变化称之为internal covariate shift。

关于BN层,这一篇博客讲得很好,http://blog.csdn.net/app_12062011/article/details/57083447我在这里转一下。

可是做者又说若是简单的这么干,会下降层的表达能力。好比下图,在使用sigmoid激活函数的时候,若是把数据限制到0均值单位方差,那么至关于只使用了激活函数中近似线性的部分,这显然会下降模型表达能力。为此,做者又为BN增长了2个参数,

用来保持模型的表达能力把BN放在激活函数以前,这是由于Wx+b具备更加一致和非稀疏的分布。

inception-v3

  • n∗n的卷积核均可以经过1∗n一维卷积后接n∗1一维卷积来代替。例如,一个 3×3 的卷积等价于首先执行一个 1×3 的卷积再执行一个 3×1 的卷积。他们还发现这种方法在成本上要比单个 3×3 的卷积下降 33%,这种非对称的卷积结构拆分,节省了大量的参数,其结果对比将一个大卷积核拆分为几个相同的小卷积核 ,效果更明显。这一结构以下图所示:

此处若是 n=3,则与上一张图像一致。最左侧的 5x5 卷积可被表示为两个 3x3 卷积,它们又能够被表示为 1x3 和 3x1 卷积。

本文的主要目的是研究如何在增长网络规模的同时,可以保证计算的高效率。

Rethinking这篇论文中提出了一些CNN调参的经验型规则,暂列以下:

  1. 避免特征表征的瓶颈。特征表征就是指图像在CNN某层的激活值,特征表征的大小在CNN中应该是缓慢的减少的。
  2. 高维的特征更容易处理,在高维特征上训练更快,更容易收敛
  3. 低维嵌入空间上进行空间汇聚,损失并非很大。这个的解释是相邻的神经单元之间具备很强的相关性,信息具备冗余。
  4. 平衡的网络的深度和宽度。宽度和深度适宜的话可让网络应用到分布式上时具备比较平衡的computational budget。

更小的卷积核

Inception Net v3 整合了前面 Inception v2 中提到的全部升级,还使用了:

  • RMSProp 优化器;

  • Factorized 7x7 卷积;

  • 辅助分类器使用了 BatchNorm;

  • 标签平滑(添加到损失公式的一种正则化项,旨在阻止网络对某一类别过度自信,即阻止过拟合)。

简而言之,就是将尺寸比较大的卷积,变成一系列3×3的卷积的叠加,这样既具备相同的视野,还具备更少的参数。
实验代表,这样作不会致使性能的损失。

Grid Size Reduction

Grid就是图像在某一层的激活值,即feature_map,通常状况下,若是想让图像缩小,能够有以下两种方式:

右图是正常的缩小,但计算量很大。左图先pooling会致使特征表征遇到瓶颈,违反上面所说的第一个规则,为了同时达到不违反规则且下降计算量的做用,将网络改成下图:

 结构如左图表示,左边两个表明的是右图中的左边分支。

label smoothing

除了上述的模型结构的改进之外,Rethinking那篇论文还改进了目标函数。

原来的目标函数,在单类状况下,若是某一类几率接近1,其余的几率接近0,那么会致使交叉熵取log后变得很大很大。从而致使两个问题:

过拟合
致使样本属于某个类别的几率很是的大,模型太过于自信本身的判断。
因此,使用了一种平滑方法,可使得类别几率之间的差异没有那么大.

Resnet和ResNeXt

解决深度网络的退化问题,常规的网络的堆叠(plain network)在网络很深的时候,效果却愈来愈差了。其中的缘由之一便是网络越深,梯度消失的现象就愈来愈明显,网络的训练效果也不会很好。
可是如今浅层的网络(shallower network)又没法明显提高网络的识别效果了,因此如今要解决的问题就是怎样在加深网络的状况下又解决梯度消失的问题。

做者提出了Residual的结构:

即增长一个identity mapping(恒等映射),将原始所须要学的函数H(x)转换成F(x)+x,而做者认为这两种表达的效果相同,可是优化的难度却并不相同,做者假设F(x)的优化 会比H(x)简单的多。这一想法也是源于图像处理中的残差向量编码,经过一个reformulation,将一个问题分解成多个尺度直接的残差问题,可以很好的起到优化训练的效果。
这个Residual block经过shortcut connection实现,经过shortcut将这个block的输入和输出进行一个element-wise的加叠,这个简单的加法并不会给网络增长额外的参数和计算量,同时却能够大大增长模型的训练速度、提升训练效果,而且当模型的层数加深时,这个简单的结构可以很好的解决退化问题。

接下来,做者就设计实验来证实本身的观点。
首先构建了一个18层和一个34层的plain网络,即将全部层进行简单的铺叠,而后构建了一个18层和一个34层的residual网络,仅仅是在plain上插入了shortcut,并且这两个网络的参数量、计算量相同,而且和以前有很好效果的VGG-19相比,计算量要小不少。这也是做者反复强调的地方,也是这个模型最大的优点所在。

模型构建好后进行实验,在plain上观测到明显的退化现象,并且ResNet上不只没有退化,34层网络的效果反而比18层的更好,并且不只如此,ResNet的收敛速度比plain的要快得多。

对于shortcut的方式,做者提出了三个选项:

  1. 使用恒等映射,若是residual block的输入输出维度不一致,对增长的维度用0来填充;
  2. 在block输入输出维度一致时使用恒等映射,不一致时使用线性投影以保证维度一致;
  3. 对于全部的block均使用线性投影。

对这三个选项都进行了实验,发现虽然3的效果好于2的效果好于1的效果,可是差距很小,所以线性投影并非必需的,而使用0填充时,能够保证模型的复杂度最低,这对于更深的网络是更加有利的。另外,shortcut过程当中,stride是2能够保证feature map的大小一致。

进一步实验,做者又提出了deeper的residual block:

  这至关于对于相同数量的层又减小了参数量,所以能够拓展成更深的模型。因而做者提出了50、10一、152层的ResNet,并且不只没有出现退化问题,错误率也大大下降,同时计算复杂度也保持在很低的程度。

这个时候ResNet的错误率已经把其余网络落下几条街了,可是彷佛还并不知足,因而又搭建了更加变态的1202层的网络,对于这么深的网络,优化依然并不困难,可是出现了过拟合的问题,而且也很容易出现梯度消失或者梯度爆炸问题,这是很正常的,做者也说了之后会对这个1202层的模型进行进一步的改进。

Inception v4 和 Inception -ResNet 在同一篇论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中介绍。为清晰起见,咱们分红两个部分来介绍。

Inception-ResNet v1 和 v2

受 ResNet 的优越性能启发,研究者提出了一种混合 inception 模块。Inception ResNet 有两个子版本:v1 和 v2。在咱们分析其显著特征以前,先看看这两个子版本之间的微小差别。

  • Inception-ResNet v1 的计算成本和 Inception v3 的接近

  • Inception-ResNetv2 的计算成本和 Inception v4 的接近

  • 它们有不一样的 stem,正如 Inception v4 部分所展现的

  • 两个子版本都有相同的模块 A、B、C 和缩减块结构。惟一的不一样在于超参数设置。在这一部分,咱们将聚焦于结构,并参考论文中的相同超参数设置(图像是关于 Inception-ResNet v1 的)

问题:引入残差链接,它将 inception 模块的卷积运算输出添加到输入上。

方法:为了使残差加运算可行,卷积以后的输入和输出必须有相同的维度。所以,咱们在初始卷积以后使用 1x1 卷积来匹配深度(深度在卷积以后会增长)。

 

 Inception ResNet 中的 Inception 模块 A、B、C。注意池化层被残差链接所替代,并在残差加运算以前有额外的 1x1 卷积。

主要 inception 模块的池化运算由残差链接替代。然而,你仍然能够在缩减块中找到这些运算。缩减块 A 和 Inception v4 中的缩减块相同。

 (左起)缩减块 A(从 35x35 到 17x17 的尺寸缩减)和缩减块 B(从 17x17 到 8x8 的尺寸缩减)。这里参考了论文中的相同超参数设置(V,I,K)。(图源:https://arxiv.org/pdf/1602.07261.pdf)

若是卷积核的数量超过 1000,则网络架构更深层的残差单元将致使网络崩溃。所以,为了增长稳定性,做者经过 0.1 到 0.3 的比例缩放残差激活值。

 

 激活值经过一个常数进行比例缩放,以防止网络崩溃。

  • 原始论文并无在求和以后使用批归一化,以在单个 GPU 上训练模型(在单个 GPU 上拟合整个模型)。

  • 研究发现 Inception-ResNet 模型能够在更少的 epoch 内达到更高的准确率。

  • Inception v4 和 Inception-ResNet 的网络完整架构以下图所示:

这篇论文里,做者借鉴了resnet的残差网络的思想,将其应用到了inception-v3当中,结构以下:

inception-v4:Inception with skip connections

论文:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

问题:某些模块有没必要要的复杂性。咱们应该添加更多一致的模块来提升性能。

方法:Inception v4 的 stem 被修改了。这里的 stem 参考了在引入 Inception 块以前执行的初始运算集。

 图上部是 Inception-ResNet v1 的 stem。图下部是 Inception v4 和 Inception-ResNet v2 的 stem

它们有三个主要的 Inception 模块,称为 A、B 和 C(和 Inception v2 不一样,这些模块确实被命名为 A、B 和 C)。它们看起来和 Inception v2(或 v3)变体很是类似。

Inception v4 引入了专用的「缩减块」(reduction block),它被用于改变网格的宽度和高度。早期的版本并无明确使用缩减块,但也实现了其功能。

 缩减块 A(从 35x35 到 17x17 的尺寸缩减)和缩减块 B(从 17x17 到 8x8 的尺寸缩减)。这里参考了论文中的相同超参数设置(V,I,k)。

inception-v4 是经过提出了更多新的inception module扩展网络结构,可以达到和inception-resnet-v2相媲美的效果,这个有时间再研究一下。

 网络的性能分析图

 

 

Xception

Xception 是 Google 继 Inception 后提出的对 Inception-v3 的另外一种改进。

做者认为,通道之间的相关性 与 空间相关性 最好要分开处理。采用 Separable Convolution(极致的 Inception 模块)来替换原来 Inception-v3中的卷积操做。

在 Inception 中,特征能够经过 1×1卷积,3×3卷积,5×5 卷积,pooling 等进行提取,Inception 结构将特征类型的选择留给网络本身训练,也就是将一个输入同时输给几种提取特征方式,而后作 concat 。Inception-v3的结构图以下:

 

对 Inception-v3 进行简化,去除 Inception-v3 中的 avg pool 后,输入的下一步操做就都是 1×1卷积:

 

提取 1×11×11×1 卷积的公共部分:

Xception(极致的 Inception):先进行普通卷积操做,再对 1×11×11×1 卷积后的每一个channel分别进行 3×33×33×3 卷积操做,最后将结果 concat:

深度可分离卷积 Depthwise Separable Convolution

 传统的卷积实现过程---->Depthwise Separable Convolution 的实现过程:

--->

Depthwise Separable Convolution 与 极致的 Inception 区别:

极致的 Inception:

第一步:普通 1×11×11×1 卷积。

第二步:对 1×11×11×1 卷积结果的每一个 channel,分别进行 3×33×33×3 卷积操做,并将结果 concat。

Depthwise Separable Convolution:

第一步:Depthwise 卷积,对输入的每一个channel,分别进行 3×33×33×3 卷积操做,并将结果 concat。

第二步:Pointwise 卷积,对 Depthwise 卷积中的 concat 结果,进行 1×11×11×1 卷积操做。

两种操做的循序不一致:Inception 先进行 1×11×11×1 卷积,再进行 3×33×33×3 卷积;Depthwise Separable Convolution 先进行 3×33×33×3 卷积,再进行 1×11×11×1 卷积。(做者认为这个差别并无大的影响)

做者发现,在“极致的 Inception”模块中,用于学习空间相关性的 3×33×33×3 的卷积,和用于学习通道间相关性的 1×11×11×1 卷积之间,不使用非线性激活函数时,收敛过程更快、准确率更高:

DenseNet

如今咱们有三种方式来处理不一样卷积层之间的特征图:

  • Standard Connectivity
  • Residual/Skip Connectivity
  • Densenet: Dense Connectivity

标准链接

Residual/Skip 链接

 

DenseNet:密集链接性

  DenseNet的思想是某一层的输入是其前面每一层的输出,即将不一样层获得的特征图进行融合做为某一层的输入,这样CNN的每一层就能够获得前面不一样层提取的特征(浅层位置等基础信息,深层语义信息),这样网络的表达能力会更好。图示以下:

  若是仅仅如以前那么设计的话,很容易出现梯度爆炸,因此:用以前提到的1∗11*11∗1卷积!bottleneck降维

下图是Dense Blocks的结构图,在每一个Dense Blocks内部,每层的feature map的大小是一致的(方便特征融合),不一样Dense Blocks之间有Pooling层用于减少feature map的大小。

总结

基础框架:Lenet、Alexnet、VGG、Prelu

Inception系列(网络):从Inception v1 到v4 以及Inception-Resnet系列

Resnet系列 (长网络):从Resnet被提出后,许许多多该架构被相应提出,Desnet表现出其良好的优越性,残差网络使网络可以更好的处理梯度消失问题。PreActResNet将bn和relu放在前面,获得了很好的效果。还有Resnetx等,这里很少介绍了。

轻型模型 (轻网络):受限移动端的设备,主要思想是将卷积核分离,SqueezeNet 大量采用1x1的网络。mobilenet将3x3的网络分离为n个3x3的卷积核和1x1的卷积核。Shufflenet系列考不一样channel之间的关联,提出group1x1,而后再进行混洗。

attention模型(重网络):相似与文本的attention,主要针对不一样channel的权重和每一个channel不一样区域的权重。Residual Attention Network和Senet为典型。

参考

XreCis CSDN博客:https://blog.csdn.net/lly1122334/article/details/88717074

21秒看尽ImageNet屠榜模型,60+模型架构同台献艺

个人收藏2018(技术类)

深度学习(图像方向)常见名词术语

基于深度学习的13种通用图像分类模型及其实现

SENets-Residual Attention Networks

其中两个你没写道:SegNet、SqueezeNet、YOLO、ResNeXt

SincNet

相关文章
相关标签/搜索