一.CNN发展纵览html
咱们先来看一张图片:算法
1985年,Rumelhart和Hinton等人提出了后向传播(Back Propagation,BP)算法(也有说1986年的,指的是他们另外一篇paper:Learning representations by back-propagating errors),使得神经网络的训练变得简单可行,这篇文章在Google Scholar上的引用次数达到了19000屡次,目前仍是比Cortes和Vapnic的Support-Vector Networks稍落后一点,不过以Deep Learning最近的发展劲头来看,超越指日可待。网络
几年后,LeCun利用BP算法来训练多层神经网络用于识别手写邮政编码,这个工做就是CNN的开山之做,多处用到了5*5的卷积核,但在这篇文章中LeCun只是说把5*5的相邻区域做为感觉野,并未说起卷积或卷积神经网络。ide
1998年的LeNet5标注着CNN的真正面世,可是这个模型在后来的一段时间并未能火起来,主要缘由是要求机器性能较好,并且其余的算法像SVM也能达到相似的效果甚至超过。性能
AlexNet是在2012年被发表的一个经典之做,并在当年取得了ImageNet最好的成绩,也是在那年以后,更多的更深的神经网络被提出,其官方提供的数据模型,他的top-1偏差率为37.5%,以及top-5的偏差率为17%,这是至关好的一个成绩。学习
2014年,VGG-Net 在ILSVRC localization and classification 两个问题上分别取得了第一名和第二名,VGG-Net不一样于AlexNet的地方是:VGG-Net使用更多的层,一般有16-19层,而AlexNet只有8层。另一个不一样的地方是:VGG-Net的全部 convolutional layer 使用一样大小的 convolutional filter,大小为 3 x 3。优化
同年,GoogLeNet, 在2014年ILSVRC挑战赛得到冠军,将Top5 的错误率下降到6.67%. 一个22层的深度网络,论文在http://arxiv.org/pdf/1409.4842v1.pdf,题目为:Going deeper with convolutions。GoogLeNet这个名字也是挺有意思的,为了像开山鼻祖的LeNet网络致敬,他们选择了这样的名字。ui
下图为GooLeNet的网络结构图:编码
使人感兴趣的是,在GoogLeNet出来以前,主流的网络结构突破大体是网络更深(即层数增长),网络更宽(即神经元数目增多),但这样作存在一些缺点:spa
针对上述缺点,咱们考虑到一味的追求准确率而增长网络规模有一部分缘由就是特征提取模块的设计没有能很好提取出图像的特征,若是能在基本的特征提取单元上作一些优化,而后用优化后的特征提取模块去构建网络,可能会有利于最后的识别效果。由此,Inception 模型孕育而生。
二.Inception v1模型
通常的卷积层只是一味增长卷积层的深度,可是在单层上卷积核却只有一种,好比对于VGG,单层卷积核只有3x3大小的,这样特征提取的功能可能就比较弱。GoogLenet想的就是能不能增长单层卷积层的宽度,即在单层卷积层上使用不一样尺度的卷积核,GoogLenet构建了Inception module这个基本单元,基本的Inception module中有1x1卷积核,3x3卷积核,5x5卷积核还有一个3x3下采样,从而产生了Inception v1模型,以下图所示,
这样尺寸不一样的卷积核就能够提取不一样尺寸的特征,单层的特征提取能力加强了,可是我在读的过程当中想到的问题是,对于像VGG这种网络,我一样能够经过卷积-下采样-卷积这种方式提取不一样尺寸的信息,因此为什么Inception module这种网络会有很好的效果的,我想到的缘由是卷积-下采样-卷积虽然可以提取不一样尺寸的信息,可是因为是经过下采样这种方式实现的,因此必会带来信息的丢失,和Inception module这种方式相比,显然丢失的信息更多。
上面Inception module结构会存在一个问题,就是前一层的输出不经任何处理直接输入到下一层的卷积层中,这样若是前一层的特征图数量不少,有通过5x5这种大尺寸的卷积,带来的计算量也是很是大。从而产生了Inception v2模型。
三.Inception v2模型
Inception v2的网络在v1的基础上,进行了改进,一方面了加入了BN层,减小了Internal Covariate Shift(内部neuron的数据分布发生变化),使每一层的输出都规范化到一个N(0, 1)的高斯,另一方面学习VGG用2个3x3的conv替代inception模块中的5x5,既下降了参数数量,也加速计算;
一个5*5的网络等于两个3*3的降级:
因此在修正事后的Inception module在输出到下一层卷积以前,会对数据进行一次降维,怎么降维,就是采用1x1卷积核实现,好比原来有256个输入特征图,先用1x1的卷积核对特征图进行线性组合,使得输出只有96的特征图,这样不会带来信息损失,又减少了下一层卷积的计算量,修正后的Inception module以下图所示:
这种Inception module既能大大提高卷积提取特征的能力,又不会使计算量提高不少。它的网络结构以下:
1.避免表示瓶颈,即特征图大小应缓慢降低,特别是在网络靠前的地方;信息流前向传播过程当中显然不能通过高度压缩的层,即表达瓶颈。从input到output,feature map的宽和高基本都会逐渐变小,可是不能一会儿就变得很小。好比你上来就来个kernel = 7, stride = 5 ,这样显然不合适。 另外输出的维度channel,通常来讲会逐渐增多(每层的num_output),不然网络会很难训练。(特征维度并不表明信息的多少,只是做为一种估计的手段)
2.高维表示能够用网络代替;高维特征更易处理。 高维特征更易区分,会加快训练。
3. 能够在低维嵌入上进行空间汇聚而无需担忧丢失不少信息。 好比在进行3x3卷积以前,能够对输入先进行降维而不会产生严重的后果。假设信息能够被简单压缩,那么训练就会加快。
4.平衡网络的宽度和深度。
使用大尺寸滤波器卷机分解:
GoogleNet的精度增益主要来自维度下降,这能够认为是卷积分解的特例。考虑到网络临近的激活高度相关,所以集成以前能够降维。Inception模块是全卷积的,每一个权值对应一个乘法运算,进行卷积分解后能够减小参数数目进行快速训练,这样就能够增长滤波器组的大小提高精度。
将大卷积分解成小卷积:
5×5的卷积可使用两层3×3卷积代替,如图4为原始Inception模块,图5为替换后的模块,节约的计算时间能够用来增长滤波器数目。对于一个5x5卷积核卷积的区域,能够先使用一个3x3对5x5的区域进行卷积,而后再使用一个3x3核对刚刚的卷积结果再进行一次卷积,最终也是得出一个数据,在效果上和5x5卷积是等效的。这样就减小了一次卷积计算的次数,原来5x5卷积须要作25次乘加,如今两次3x3只须要作9+9=18次乘加,若是卷积核更大,减少的计算量也更大。
是基于什么考虑才作这种分解呢?咱们能够看到分解致使卷积核的参数变小,这就说明原来5x5卷积核实际上是有部分参数冗余的,即咱们其实并不须要25个参数提取特征,而可能须要18个参数就能够了,这时由于因为提取区域像素都是紧邻的,像素之间的关联性很强,这都到时5x5卷积核各个参数之间其实也是有很强关联的,即参数存在冗余能够进一步压缩;进一步想,其实这是一种紧密网络到稀疏网络的转换。上面所说的是大的卷积核分解成小的卷积核,Inception v3中还提出了另外一种分解方式从图中能够看出,3x3的卷积,能够先用一个1x3的卷积,紧接着跟着一个3x1的卷积也是能够实现相同的输出的,一样对于5x5和7x7也是能够处理的,这样也能够明显下降卷积核参数和计算量。
须要注意的是:3×3的卷积使用3×1卷积和1×3卷积代替,这种结构在前几层效果不太好,但对特征图大小为12~20的中间层效果明显。
附加分类器
附加分类器有batch norm层效果更好,得出其扮演规格化的角色。GoogLenet中就作过类似的工做,常规网络都是在最后一层计算loss,而后进行梯度方向传播,可是若是网络层不少,这就致使梯度消失的现象,使用Auxiliary Classifiers,在网络中间层加上分类器,计算辅助失真和梯度,而后把这个梯度加到常规网络的梯度上,有效解决了梯度消失的现象,其实这样作的方式,呼应了ResNet中解决梯度消失的问题得方法,虽然ResNet表面上看起来loss是在最后一层计算的,可是其实本质上最后一层的loss其实在R esNet的子网络中都有计算,也就至关于GoogLenet中把loss层加上网络中间层的方式。
在GoogLeNet中,使用了多余的在底层的分类器,直觉上能够认为这样作可使底层可以在梯度降低中学的比较充分,但在实践中发现两条:
觉得多余的分类器起到的是梯度传播下去的重要做用,但经过实验认为实际上起到的是regularizer的做用,由于在多余的分类器前添加dropout或者batch normalization后效果更佳。
下降特征图大小
池化用来下降特征图大小,为避免表示瓶颈,即更有效的保存图像信息,应在池化以前增长滤波器数目,之前的网络都是在卷积层后面加上一个pooling层来下降特征图的尺寸,可是这种下降尺寸的方式不可避免地有信息的损失,在《Rethinking Inception》论文中提出了另外一种下降特征图尺寸的方式以下图所示:
右图是正常的缩小,但计算量很大。左图先pooling会致使特征表征遇到瓶颈,违反上面所说的第一个规则,为了同时达到不违反规则且下降计算量的做用,将网络改成下图
实验结果与GoogleNet相比有较大提高,以下表所示: