Going deeper with convolutions-22层
https://my.oschina.net/u/876354/blog/1637819
那么,GoogLeNet是如何进一步提升性能的呢?
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。
所以,有人调侃“深度学习”其实是“深度调参”。
解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。
那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,就如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。
与VGG是同时期的作品,提出了Inception结构(for classification and detection in the ImageNet Large-Scale Visual Recognition Challenge 2014),uses 12* fewer parameters than the winning architecture of 2012,and more accurate
值得注意的是,本文提出的深层体系结构设计考虑的因素包括这个因素,而不是完全依赖于精确的数字。
deep有两种含义:
- 在某种意义上,我们引入了一个新的组织层次,其形式是“Inception模块”
- 更直接的意义是说增加的网络深度
1*1卷积有两个目的:
- 主要是用来作为维度减少模块,去移除计算的bottlenecks
- 可以限制网络的大小
可以增加网络的深度和宽度并且没有性能的惩罚
目前主要的目标检测算法是R-CNN,其将检测问题分成了两个子问题:
- 首先利用颜色和超像素一致性等低层次线索,以一种不确定类别的方式指名潜在的对象
- 然后使用CNN分类器在这些位置识别对象类别
Motivation and High Level Considerations
最直接的改善深度神经网络的方式就是增加他们的大小,包括增加网络的深度和levels的数量以及他的宽度:即每个level的单元的数量
但是这种简单的方式也会导致两个主要的问题:
- 更大的大小意味着更多的参数,使网络更容易过拟合,尤其是当训练集中标签实例的数量是有限的时。这将成为一个主要的瓶颈
- 也会增加计算资源的使用
解决上面两个问题的基本方法就是将完全连接改成稀疏连接。该方法的缺点是,当涉及到非均匀稀疏数据结构的数值计算时,当今的计算基础设施非常低效
这就提出了一个问题:是否还有希望实现下一个中间步骤:一种利用额外的稀疏性的体系结构,即使是在过滤器级别,就像理论所建议的那样,但是通过使用密集矩阵上的计算来利用我们当前的硬件
关于稀疏矩阵计算的大量文献表明,将稀疏矩阵聚类成相对密集的子矩阵,往往能够提供最先进的稀疏矩阵乘法的实用性能。在不久的将来,类似的方法将被用于非统一的深度学习体系结构的自动化构建,这种想法似乎并不牵强。
Architectural Details
Inception架构的主要思想是找出卷积视觉网络中最优的局部稀疏结构是如何被现成的密集组件逼近和覆盖的
translation invariance平移不变性意味着我们的网络将会从卷积构建blocks开始构建。我们所需要的是找到最优的局部结构,并在空间上重复它
Arora et al.[2]提出了一种分层结构,即分析最后一层的相关统计数据,并将其聚类成具有高相关性的单元组。这些集群构成下一层的单元,并与上一层中的单元连接。我们假设前一层的每个单元对应于输入图像的某个区域,这些单元被分组到过滤器组中。在较低的层(靠近输入的层)中,相关单元将集中在局部区域。这意味着,我们最终会得到许多集群集中在一个区域,它们可以被下一层的1×1卷积所覆盖,如[12]中所示。然而,我们也可以预期,在更大的patch上,能够被卷积覆盖的空间分布更广的集群的数量会更少,而在越来越大的区域上,patch的数量会越来越少。为了避免补丁对齐问题,Inception架构的当前版本被限制为过滤大小为1×1,3×3和5×5,但是这个决定更多的是基于方便而不是必要。这还意味着,建议的体系结构是所有这些层的组合,它们的输出过滤器库连接成一个输出向量,形成下一阶段的输入。此外,由于pooling操作对于当前最先进的卷积网络的成功至关重要,因此建议在每个这样的阶段中添加一个可选的并行pooling路径也应该有额外的好处(参见图2(a))。
a图的结构有一个问题就是在带着大量过滤器的卷积层的顶端的中等数量的5*5卷积会过度昂贵
一旦将池单元添加到组合中,这个问题就会变得更加明显:它们的输出过滤器数量等于前一阶段的过滤器数量。将池化层的输出与卷积层的输出合并,将不可避免地导致各个阶段的输出数量增加。尽管这种体系结构可能覆盖最优的稀疏结构,但它的效率非常低,会在几个阶段内导致计算崩溃。
https://my.oschina.net/u/876354/blog/1637819
该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。
网络卷积层中的网络能够提取输入的每一个细节信息,同时5x5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个ReLU操作,以增加网络的非线性特征。
然而这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了,造成了特征图的厚度很大,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用
1x1的卷积核有什么用呢?
1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。
这就引出了提出的体系结构的第二个想法:明智地应用维数减少和投影,否则计算需求将增加太多。这是基于嵌入embedding的成功:即使是低维嵌入也可能包含大量关于相对较大的图像patch的信息。然而,嵌入以密集、压缩的形式表示信息,而压缩的信息更难建模。我们希望在大多数地方保持稀疏的表示(根据[2]条件的要求),并且只在必须集中信号时压缩它们。也就是说,在昂贵的3×3和5×5卷积之前,使用1×1卷积计算约简。除了作为回报,他们还包括使用校正线性激活,使他们的双重用途。最终结果如图2(b)所示。
通常,Inception网络是由上述类型的模块组成的网络,这些模块相互堆叠,偶尔使用带有stride 2的最大池化层来将网格的分辨率减半。由于技术上的原因(训练期间的内存效率),开始只在较高的层上使用Inception模块似乎是有益的,同时以传统的卷积方式保持较低的层。这并不是严格必要的,只是反映了我们当前实现中的一些基础设施效率低下。
这种体系结构的一个主要好处是,它允许在每个阶段显著增加单元的数量,而不会在计算复杂度上失控地膨胀。维数减少的普遍使用允许将上一阶段的大量输入过滤器屏蔽到下一层,首先减少它们的维数,然后再将它们与一个较大的patch大小进行卷积。这种设计的另一个实际有用的方面是,它符合直觉,即视觉信息应该在不同的尺度上处理,然后聚合,以便下一阶段可以同时从不同的尺度上抽象特征。
计算资源的改进使用允许增加每个阶段的宽度和阶段的数量,而不会陷入计算困难。使用inception体系结构的另一种方法是创建稍差但计算上更便宜的版本。我们发现,所有包含的旋钮和杠杆都允许控制计算资源的平衡,从而使网络的运行速度比使用non-Inception架构的网络快2 - 3倍,但这需要仔细的手工设计。
GoogLeNet
该网络的参数说明为:
所有卷积层后面都使用了ReLU函数
网络结构如下图所示:
如果只计算带有参数的层,该网络有22层;如果加上pooling层则有27层
对上图说明如下:
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整,比如当你想要修改分类数时;
(3)虽然移除了全连接,但是网络中依然使用了Dropout ;
(4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。
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类似,在此就不再重复。
训练:
使用SGD随机梯度下降法,momentum=0.9,学习率每8个epoch下降4%