LeNet

LeNet是最早的卷积神经网络模型,针对全连接网络权值参数多,系统开销大,完全忽略了图像的局部结构对平移、形变不具有不变性的缺点,提出了一种利用卷积层和池化层堆叠进行特征提取的框架。

特点:

  1. 使用卷积提取局部特征,每个卷积核提取特定模式的特征,底层提取初级特征,高层对底层特征组合与抽象,训练中进行参数学习
  2. 引入Sigmoid非线性激活函数,提高模型表达能力
  3. 使用均值池化对提取的特征进行下采样:增强局部感受野,忽略目标的倾斜、旋转之类的相对位置的变化,提高平移不变性;降低特征图的维度,避免过拟合
  4. 全连接层作为最后的分类器,特征提取到分类的桥梁

AlexNet 

AlexNet 是第一个可实用于图像分类的卷积神经网络,其核心是堆砌卷积和池化层,可以看作更深更宽的版本的LeNet。AlexNet首次在CNN中应用了ReLU、LRN、Dropout,并使用了GPU进行运算加速。

AlexNet主要技术点

  1. 使用ReLU替代Sigmoid激活函数,很好的抑制了网络较深时的梯度消失问题,提高了网络的训练速率。
  2. 引入了局部响应归一化(Local Response Normalization, LRN),(ReLU后进行归一化处理),对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
  3. 在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
  4. 应用了分组卷积来突破GPU的显存瓶颈(当时使用的计算硬件为Nvidia GTX580,显存3GB)。
  5. 数据增强,利用随机裁剪和翻转镜像操作增加训练数据量,提升泛化能力,降低过拟合。
  6. 在网络末端加入全连接层,使用Dropout随机忽略一部分神经元以避免模型过拟合,最后利用Softmax函数进行多分类

AlexNet卷积核的尺寸依次为11×11、5×5和3×3;第一层卷积步长为4,之后保持为1。LRN层分别出现在前两个卷积层后,而最大池化层出现在两个LRN层及最后一个卷积层后。整个AlexNet有8个需要训练参数的层(前5层卷积层,后3层全连接层,不包括池化层和LRN层),卷积层可以通过较小的参数量提取有效的特征,前几个卷积层计算量很大,但参数量很小,只占AlexNet总参数量的很小一部分。最后一层是有1000类输出的Softmax层用作分类。

CNN常用网路_卷积

CNN常用网路_卷积核_02

AlexNet每层的超参数、参数量、计算量上图所示。

VGGNet

VGG系列网络在AlexNet的基础上,用较小的3×3卷积核替代了之前的5×5和7×7等大卷积核,并用2×2池化核代替3×3的大池化核,大大加深了网络深度达到19层,并扩宽特征图,使得模型架构更深更宽,同时通过结合多个卷积网络的输出进行集成(Ensemble)。由于VGGNet迁移到其他图片数据上的泛化性非常好,经常被用来提取图像特征。

关键点:

  • 对卷积核和池化大小进行了统一,两个3*3的卷积核代替5*5的卷积核,三个3*3代替7*7,并用2×2池化核代替3×3的大池化核,多个小尺度的卷积核比大尺度的卷积核非线性更强,有更好的特征提取能力(前者可以使用三次ReLU激活函数,而后者只有一次),同时参数减少,不容易过拟合。
  • 采用卷积层堆叠的策略,将多个连续的卷积层构成卷积层组。
  • 随着网络的深入,不同级别的网络层数逐渐加深,网络的表达能力也逐渐增强。
  • 可以注意到后一个卷积核层数是前一个的两倍,也是降低空间维度,增加深度
  • 此网络在分类和定位的任务上都能有很好的变现。
  • 训练时使用了数据增强方法
  • 这个网络说明了深层的卷积神经网络有十分好的表现
  • 1´1卷积的意义主要在于线性变换,而输入通道数和输出通道数不变,没有发生降维。

优点:

  • 和单个卷积层相比,卷积组可以提高感受野范围,增强网络的学习能力和特征表达能力;
  • 和具有较大核的卷积层相比,采用多个具有小卷积核的卷积层串联的方式能够减少网络参数;
  • 在每层卷积之后进行ReLU非线性操作可以进一步提升网络的特征学习能力。

VGGNet包含5组卷积操作,每组包含1~4个连续的卷积层,每两个卷积层之间为最大值池化层。每组内的卷积层具有相同的结构。

从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,因为参数量主要都集中在最后3个全连接层。卷积部分虽然很深,但参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。

作者在对比各级网络时总结出了以下几个观点。

  1. LRN层作用不大,并不能改善网络的性能。
  2. 越深的网络效果越好,分类误差随着深度的增加而降低。
  3. 1*1的卷积也是很有效的,但是没有3*3的卷积好,大一些的卷积核可以学习更大的空间特征。

 

 

深度残差网络(Deep  Residual Network,ResNet)

ResNet对传统的神经网络进行网络结构进行改进,ResNet提出了跳层连接(Shortcut Connection)的概念,即在网络中构筑多条“近道”。缓解了深层神经网络训练中的梯度消失和网络退化问题。而且ResNet随着模型结构的加深,训练误差逐渐降低,并且优于相同层数的传统的神经网络。ResNet跳层连接的提出使得现有网络结构可以毫无阻碍地进一步加深至百余层甚至千余层而且不用担心性能损失或训练困难,这样既增加了网络的深度提高了网络的表达能力,同时由于跳层连接训练的速度也更快了。

网络的退化(Degeneration):随着网络层数的加深,网络的训练误差和测试误差同时上升,这并不是过拟合,因为过拟合的标志是训练误差较低,测试误差较高。

跳层连接的优势:

  1. 缩短了各层接受到损失函数反向传播的路径总长,有效抑制梯度消失的现象,使得网络在不断加深时性能不会下降。
  2. 由于有“近道”存在,如果网络在层数加深时性能退化,可以通过控制网络“近道”和非“近道”的组合比例来退回到浅层时的状态

深度网络容易造成梯度在 back propagation 的过程中消失,导致训练效果很差,而深度残差网络在神经网络的结构层面解决了这一问题,使得就算网络很深,梯度也不会消失。

CNN常用网路_CNN常用网路_03

输入x经过两层神经网络的简单叠加变换得到H(x)(图(a)),反向传播时,可能会在离输入近的网络层中产生梯度消失的现象。

但深层网络并非学不到东西而是更难优化,假设:深层网络至少可以和浅层网络持平,y=x,虽然增加了深度,但误差不会增加。ResNet把网络结构调整为,既然离输入近的神经网络层较难训练,那么我们可以将它短接到更靠近输出的层,如图(b)。

ResNet的灵感来源:一个比较浅的网络已达到了饱和的准确率,在它后面再加上几个恒等映射层(Identity mapping,也即y=x,输出等于输入),这样就增加了网络的深度,并且起码误差不会增加,也即更深的网络不应该带来训练集上误差的上升。

输入x经过两个神经网络的变换得到F(x),同时x也短接到两层之后,最后这个包含两层的神经网络模块输出H(x)=F(x)+x。这样一来,F(x)被设计为只需要拟合输入x与目标输出H(x)的残差H(x)-x。此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。如果某一层的输出已经较好的拟合了期望结果,那么多加入一层不会使得模型变得更差,因为该层的输出将直接被短接到两层之后,相当于直接学习了一个恒等映射,而跳过的两层只需要拟合上层输出和目标之间的残差即可。

如果已经学习到较饱和的准确率(或者当发现下层的误差变大时),那么接下来的学习目标就转变为恒等映射的学习,也就是使输入x近似于输出H(x),以保持在后面的层次中不会造成精度下降。

 在上图的残差网络结构图中,通过“shortcut connections(捷径连接)”的方式,直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,那么H(x)=x,即恒等映射。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。
这种残差跳跃式的结构,打破了传统的神经网络n-1层的输出只能给n层作为输入的惯例,使某一层的输出可以直接跨过几层作为后面某一层的输入,其意义在于为叠加多层网络而使得整个学习模型的错误率不降反升的难题提供了新的方向。

CNN常用网路_池化_04

从图可以看出,怎么有一些“shortcut connections(捷径连接)”是实线,有一些是虚线,有什么区别呢?
因为经过“shortcut connections(捷径连接)”后,H(x)=F(x)+x,如果F(x)和x的通道相同,则可直接相加,那么通道不同要分情况考虑:

  • 实线的Connection部分,表示通道相同,可以采用计算方式为H(x)=F(x)+x
  • 虚线的的Connection部分,表示通道不同,如3x3x64和3x3x128的特征图,可采用的计算方式为H(x)=F(x)+Wx,其中W是卷积操作,用来调整x维度的。

除了上面提到的两层残差学习单元,还有三层的残差学习单元,如下图所示:

下图展示了两种形态的残差模块,左图是常规残差模块,有两个3×3卷积核卷积核组成,但是随着网络进一步加深,这种残差结构在实践中并不是十分有效。针对这问题,右图的“瓶颈残差模块”(bottleneck residual block)可以有更好的效果,它依次由1×1、3×3、1×1这三个卷积层堆积而成,这里的1×1的卷积能够起降维或升维的作用,从而令3×3的卷积可以在相对较低维度的输入上进行,以达到提高计算效率的目的。

CNN常用网路_卷积_05

 

两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),其目的主要就是为了减少计算和参数量。。左图是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,右图是第一个1x1的卷积把256维通道降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,右图的参数数量比左图减少了16.94倍,因此,右图的主要目的就是为了减少参数量,从而减少计算量。

数据经过了两条路线,一条是常规路线,另一条则是捷径(shortcut),直接实现单位映射的直接连接的路线,这有点类似与电路中的“短路”。通过实验,这种带有shortcut的结构确实可以很好地应对退化问题。我们把网络中的一个模块的输入和输出关系看作是y=H(x),那么直接通过梯度方法求H(x)就会遇到上面提到的退化问题,如果使用了这种带shortcut的结构,那么可变参数部分的优化目标就不再是H(x),若用F(x)来代表需要优化的部分的话,则H(x)=F(x)+x,也就是F(x)=H(x)-x。因为在单位映射的假设中y=x就相当于观测值,所以F(x)就对应着残差,因而叫残差网络。为啥要这样做,因为作者认为学习残差F(X)比直接学习H(X)简单!设想下,现在根据我们只需要去学习输入和输出的差值就可以了,绝对量变为相对量(H(x)-x 就是输出相对于输入变化了多少),优化起来简单很多。

考虑到x的维度与F(X)维度可能不匹配情况,需进行维度匹配。这里论文中采用两种方法解决这一问题:

  • zero_padding:对恒等层进行0填充的方式将维度补充完整。这种方法不会增加额外的参数
  • projection:在恒等层采用1x1的卷积核来增加维度。这种方法会增加额外的参数

CNN常用网路_CNN常用网路_06

 

CNN常用网路_卷积核_07

 

 

 

DenseNet(Dense Convolutional Network)

在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来,即每一层的输入来自前面所有层的输出,

高效利用feature,网络更窄,参数更少,抑制过拟合,每一层都直接连接input和loss,特征和梯度的传递更加有效,网络也更加容易训练,

闪光点:

  • 密集连接:缓解梯度消失问题,加强特征传递,鼓励特征复用,极大的减少了参数量

DenseNet 是一种具有密集连接的卷积神经网络。在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入。下图是 DenseNet 的一个dense block示意图,一个block里面的结构如下,与ResNet中的BottleNeck基本一致:BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3) ,而一个DenseNet则由多个这种block组成。每个DenseBlock的之间层称为transition layers,由BN−>Conv(1×1)−>averagePooling(2×2)组成

CNN常用网路_卷积核_08

密集连接不会带来冗余吗?不会!密集连接这个词给人的第一感觉就是极大的增加了网络的参数量和计算量。但实际上 DenseNet 比其他网络效率更高,其关键就在于网络每层计算量的减少以及特征的重复利用。DenseNet则是让l层的输入直接影响到之后的所有层,它的输出为:xl=Hl([X0,X1,…,xl−1]),其中[x0,x1,...,xl−1]就是将之前的feature map以通道的维度进行合并。并且由于每一层都包含之前所有层的输出信息,因此其只需要很少的特征图就够了,这也是为什么DneseNet的参数量较其他模型大大减少的原因。这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题

需要明确一点,dense connectivity 仅仅是在一个dense block里的,不同dense block 之间是没有dense connectivity的,比如下图所示。

CNN常用网路_CNN常用网路_09

天底下没有免费的午餐,网络自然也不例外。在同层深度下获得更好的收敛率,自然是有额外代价的。其代价之一,就是其恐怖如斯的内存占用。

CNN常用网路_卷积_10

 

 

 

GoogLeNet

GoogLeNet则做了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比AlexNet和VGG小很多,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。

一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。

解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。

那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,就如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。

通过设计一个稀疏网络结构,但是能够产生稠密的数据,既能增加神经网络表现,又能保证计算资源的使用效率。谷歌提出了最原始Inception的基本结构:

CNN常用网路_池化_11

该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。
网络卷积层中的网络能够提取输入的每一个细节信息,同时5x5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个ReLU操作,以增加网络的非线性特征。
然而这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了,造成了特征图的厚度很大,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构,如下图所示:

CNN常用网路_池化_12

1x1的卷积核有什么用呢?
1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。

对上图说明如下:
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全连接,但是网络中依然使用了Dropout ; 
(4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。

GoogLeNet的网络结构图细节如下:

CNN常用网路_卷积核_13

 

注:上表中的“#3x3 reduce”,“#5x5 reduce”表示在3x3,5x5卷积操作之前使用了1x1卷积的数量。

GoogLeNet网络结构明细表解析如下:
0、输入
原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
1、第一层(卷积层)
使用7x7的卷积核(滑动步长2,padding为3),64通道,输出为112x112x64,卷积后进行ReLU操作
经过3x3的max pooling(步长为2),输出为((112 - 3+1)/2)+1=56,即56x56x64,再进行ReLU操作
2、第二层(卷积层)
使用3x3的卷积核(滑动步长为1,padding为1),192通道,输出为56x56x192,卷积后进行ReLU操作
经过3x3的max pooling(步长为2),输出为((56 - 3+1)/2)+1=28,即28x28x192,再进行ReLU操作
3a、第三层(Inception 3a层)
分为四个分支,采用不同尺度的卷积核来进行处理
(1)64个1x1的卷积核,然后RuLU,输出28x28x64
(2)96个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x96,然后进行ReLU计算,再进行128个3x3的卷积(padding为1),输出28x28x128
(3)16个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x16,进行ReLU计算后,再进行32个5x5的卷积(padding为2),输出28x28x32
(4)pool层,使用3x3的核(padding为1),输出28x28x192,然后进行32个1x1的卷积,输出28x28x32。
将四个结果进行连接,对这四部分输出结果的第三维并联,即64+128+32+32=256,最终输出28x28x256
3b、第三层(Inception 3b层)
(1)128个1x1的卷积核,然后RuLU,输出28x28x128
(2)128个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x128,进行ReLU,再进行192个3x3的卷积(padding为1),输出28x28x192
(3)32个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x32,进行ReLU计算后,再进行96个5x5的卷积(padding为2),输出28x28x96
(4)pool层,使用3x3的核(padding为1),输出28x28x256,然后进行64个1x1的卷积,输出28x28x64。
将四个结果进行连接,对这四部分输出结果的第三维并联,即128+192+96+64=480,最终输出输出为28x28x480

第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与3a、3b类似,在此就不再重复。

从GoogLeNet的实验结果来看,效果很明显,差错率比MSRA、VGG等模型都要低,对比结果如下表所示:

CNN常用网路_卷积_14

 

 

在网络结构上做了创新,引入Inception结构代替了单纯的卷积+激活的传统操作(这思路最早由Network in Network提出)。GoogLeNet进一步把对卷积神经网络的研究推上新的高度。

闪光点:

  • 引入Inception结构
  • 中间层的辅助LOSS单元
  • 后面的全连接层全部替换为简单的全局平均pooling

 

通过构建密集的块结构来近似最优的稀疏结构,从而达到提高性能而又不大量增加计算量的目的;

把原来的单个结点拆分成一个神经网络,形成网中网

1*1卷积核来降维,1,3,5大小的卷积核方便对齐

层数更深,在不同深度处增加两个loss来保证梯度回传消失的现象

与Network in Netwok 类似,GoogLeNet采用子网络堆叠的方式搭建,每个子网络为一个Inception 模块:

Inception module 包含四个分支:

  • Shortcut连接:将前一层输入通过1×1卷积
  • 多尺度滤波:输入通过1×1卷积之后分别连接卷集核大小为3和5的卷积
  • 池化分支:相继连接3×3 pooling和1×1卷积

四个分支的输出经过串联恢复到输入通道大小 减少网络参数,降低运算量多尺度、多层次滤波

  • 多尺度:对输入特征图像分别在3×3和5×5的卷集核上滤波,提高了所学特征的多样性,增强了网络对不同尺度的鲁棒性。

多层次:符合Hebbian原理,即通过1×1卷积把具有高度相关性的不同通道的滤波结果进行组合,构建出合理的稀疏结构。

 

GoogleNet(Inception-v1),Inception系列网络在VGG简单堆砌3×3卷积的基础上详细地探索了网络结构设计原则。作者认为,网络性能和表达能力正相关于网络深度和参数总量,但过深的网络和过多的参数会带诸如过拟合,梯度消失或爆炸,应用场景受限等问题。一种改进现有网络结构的手段是将全连接和卷积等密集连接结构转化为稀疏的连接形式,因为这可以降低计算冗余度,精简计算量,同时维持现有网络的表达能力,而且自然界生物的神经连接也大都是稀疏的。

Inception系列网络据此提出了Inception模块,其数学依据是一个大型稀疏矩阵通常可以分解为小的密集子矩阵,以此来近似稀疏结构。Inception模块相当于将一个大通道数的卷积层替换为了由多个小通道卷积层组成的多路结构,Inception-v1同时使用1×1,3×3,5×5三种卷积核进行多路特征提取,模拟稀疏连接,同时也可以增强网络对多尺度特征的适应性

此外Inception-v1还首次提出了瓶颈(Bottleneck)结构,即在大卷积核的卷积层之前先使用1×1卷积对通道进行压缩以减少计算复杂度。同时Inception-v1还在多个中间Inception Module的输出端拉出支线接上全连接和Softmax层进行分类,计算Loss,并反传梯度,以缓解梯度消失。

CNN常用网路_卷积核_15

CNN常用网路_池化_16

Figure 1: Inception-v1使用的Inception Block,上图:简单版本,下图:带瓶颈版本

上图结构就是Inception,结构里的卷积stride都是1,另外为了保持特征响应图大小一致,都用了零填充。最后每个卷积层后面都立刻接了个ReLU层。在输出前有个叫concatenate的层,直译的意思是“并置”,即把4组不同类型但大小相同的特征响应图一张张并排叠起来,形成新的特征响应图。Inception结构里主要做了两件事:1. 通过3×3的池化、以及1×1、3×3和5×5这三种不同尺度的卷积核,一共4种方式对输入的特征响应图做了特征提取。2. 为了降低计算量。同时让信息通过更少的连接传递以达到更加稀疏的特性,采用1×1卷积核来实现降维。

这里想再详细谈谈1×1卷积核的作用,它究竟是怎么实现降维的。现在运算如下:下面图1是3×3卷积核的卷积,图2是1×1卷积核的卷积过程。对于单通道输入,1×1的卷积确实不能起到降维作用,但对于多通道输入,就不不同了。假设你有256个特征输入,256个特征输出,同时假设Inception层只执行3×3的卷积。这意味着总共要进行 256×256×3×3的卷积(589000次乘积累加(MAC)运算)。这可能超出了我们的计算预算,比方说,在Google服务器上花0.5毫秒运行该层。作为替代,我们决定减少需要卷积的特征的数量,比如减少到64(256/4)个。在这种情况下,我们首先进行256到64的1×1卷积,然后在所有Inception的分支上进行64次卷积,接着再使用一个64到256的1×1卷积。

  • 256×64×1×1 = 16000
  • 64×64×3×3 = 36000
  • 64×256×1×1 = 16000

现在的计算量大约是70000(即16000+36000+16000),相比之前的约600000,几乎减少了10倍。这就通过小卷积核实现了降维。

现在再考虑一个问题:为什么一定要用1×1卷积核,3×3不也可以吗?考虑[50,200,200]的矩阵输入,我们可以使用20个1×1的卷积核进行卷积,得到输出[20,200,200]。有人问,我用20个3×3的卷积核不是也能得到[20,200,200]的矩阵输出吗,为什么就使用1×1的卷积核?我们计算一下卷积参数就知道了,对于1×1的参数总数:20×200×200×(1×1),对于3×3的参数总数:20×200×200×(3×3),可以看出,使用1×1的参数总数仅为3×3的总数的九分之一!所以我们使用的是1×1卷积核。

CNN常用网路_卷积_17


CNN常用网路_卷积核_18

GoogLeNet网络结构中有3个LOSS单元,这样的网络设计是为了帮助网络的收敛。在中间层加入辅助计算的LOSS单元,目的是计算损失时让低层的特征也有很好的区分能力,从而让网络更好地被训练。在论文中,这两个辅助LOSS单元的计算被乘以0.3,然后和最后的LOSS相加作为最终的损失函数来训练网络。

GoogLeNet还有一个闪光点值得一提,那就是将后面的全连接层全部替换为简单的全局平均pooling,在最后参数会变的更少。而在AlexNet中最后3层的全连接层参数差不多占总参数的90%,使用大网络在宽度和深度允许GoogleNet移除全连接层,但并不会影响到结果的精度,在ImageNet中实现93.3%的精度,而且要比VGG还要快。

二、Inception V2
GoogLeNet设计的初衷就是要又准又快,而如果只是单纯的堆叠网络虽然可以提高准确率,但是会导致计算效率有明显的下降,所以如何在不增加过多计算量的同时提高网络的表达能力就成为了一个问题。
Inception V2版本的解决方案就是修改Inception的内部计算逻辑,提出了比较特殊的“卷积”计算结构。

1、卷积分解(Factorizing Convolutions)

大尺寸的卷积核可以带来更大的感受野,但也意味着会产生更多的参数,比如5x5卷积核的参数有25个,3x3卷积核的参数有9个,前者是后者的25/9=2.78倍。因此,GoogLeNet团队提出可以用2个连续的3x3卷积层组成的小网络来代替单个的5x5卷积层,即在保持感受野范围的同时又减少了参数量,如下图:

CNN常用网路_卷积核_19

 

那么这种替代方案会造成表达能力的下降吗?通过大量实验表明,并不会造成表达缺失。

可以看出,大卷积核完全可以由一系列的3x3卷积核来替代,那能不能再分解得更小一点呢?GoogLeNet团队考虑了nx1的卷积核,如下图所示,用3个3x1取代3x3卷积:

CNN常用网路_CNN常用网路_20

 

因此,任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代。GoogLeNet团队发现在网络的前期使用这种分解效果并不好,在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)。

CNN常用网路_卷积_21

2、降低特征图大小

一般情况下,如果想让图像缩小,可以有如下两种方式:

CNN常用网路_卷积_22

 

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

CNN常用网路_CNN常用网路_23

使用Inception V2作改进版的GoogLeNet,网络结构图如下:

CNN常用网路_卷积_24

 

注:上表中的Figure 5指没有进化的Inception,Figure 6是指小卷积版的Inception(用3x3卷积核代替5x5卷积核),Figure 7是指不对称版的Inception(用1xn、nx1卷积核代替nxn卷积核)。经实验,模型结果与旧的GoogleNet相比有较大提升,如下表所示:

CNN常用网路_CNN常用网路_25

 

 

 

 

 

 

CNN常用网路_卷积_26

 

三、Inception V3
Inception V3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算,又可以将1个卷积拆成2个卷积,使得网络深度进一步增加,增加了网络的非线性(每增加一层都要进行ReLU)。
另外,网络输入从224x224变为了299x299。

Inception-v3  提出了一种卷积分解的思路,首先,5×5卷积可以被分解为两个3×3卷积,以此类推(2k+1)×(2k+1)可以分解为k个3×3卷积。同样地,k×k卷积还可以分解为1×k卷积后接一个k×1卷积,以上的分解手段相对原本的大卷积核计算可以降低计算复杂度和参数量,同时将一层变为多层的策略,可以在感受野不变的情况下强化了网络特征提取能力。 Fig. 3 和 Fig. 4 展示了应用以上分解后Inception Block的变化。同时Inception-v3中首次尝试将输入图片尺寸由224×224扩大为了299×299。

CNN常用网路_卷积_27

四、Inception V4

Inception V4研究了Inception模块与残差连接的结合。ResNet结构大大地加深了网络深度,还极大地提升了训练速度,同时性能也有提升(ResNet的技术原理介绍见本博客之前的文章:大话深度残差网络ResNet)。

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

ResNet的残差结构如下:

CNN常用网路_CNN常用网路_28

 

将该结构与Inception相结合,变成下图:

CNN常用网路_卷积_29

 

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

CNN常用网路_卷积_30

 

Inception-v4在Inception-v3上的基础上,首先修改了网络初始几层的结构(文中称为Stem),同时提出了Inception-A,Inception-B,Inception-C,Reduction-A,Reduction-B等多个模块,对其进行叠加就得到了Inception-v4,以上子结构见于 Fig. 5 ,Inception-v4在ILSVRC 2012上的的单模型Top-5错误率可以低至3.8%。

CNN常用网路_卷积_31

Figure 5: Inception-v4网络分解图

同时该文中 [7] 还提出了直接应用残差网络跳层连接的Inception系列网络 Inception-ResNet-v1 和 Inception-ResNet-v2,引入残差结构可以显著加速Inception的训练,其模型分解图见 Fig. 6 ,这两个模型的单模型Top-5错误率最终可以达到4.3%和3.7%,使用三个Inception-ResNet-v2进行集成后可以进一步达到3.1%。

CNN常用网路_卷积核_32

Figure 6: Inception-ResNet网络分解图

ResNeXt [8] 是对ResNet中残差块(Residual Block)结构的一个小改进,原残差块是一个瓶颈结构,如 Fig. 7 左部分所示,ResNeXt将其改为了 Fig. 7 中和右部分形式,即缩小了瓶颈比,将中间的卷积变为分组卷积。该结构可以在不增加参数复杂度的前提提高准确率,同时还减少了超参数的数量。ResNeXt的单模型top-5错误率在相同的计算复杂度下比ResNet能下降0.5%左右。

CNN常用网路_池化_33

Figure 7: Residual Block和ResNeXt Block的对比

(左、中、右分别为Residule Block,原版ResNeXt Block和缩写版的ResNeXt Block)

 

参考:

CNN常用网路_卷积_34