一、GoogleNet模型简介 GoogleNet和VGG是2014年imagenet竞赛的双雄,这两类模型结构有一个共同特点是go deeper。跟VGG不同的是,GoogleNet做了更大胆的网络上的尝试而不是像VGG继承了Lenet以及AlexNet的一些框架,该模型虽然有22层,但大小却比AlexNet和VGG都小很多,性能优越。 深度学习以及神经网络快速发展,人们容易通过更高性能的硬件,更庞大的带标签数据和更深更宽的网络模型等手段来获得更好的预测识别效果,但是这一策略带来了两个重要的缺陷。 (1)更深更宽的网络模型会产生巨量参数,从而容易出现过拟合现象。 (2)网络规模加大会极大增加计算量,消耗更多的计算资源。 解决这两个缺陷的根本方法就是将全连接甚至一般的卷积都转化为稀疏连接。一方面现实生物神经系统的连接也是稀疏的,另一方面有文献表明:对于大规模稀疏的神经网络,可以通过分析激活值的统计特性和对高度相关的输出进行聚类来逐层构建出一个最优网络。这点表明臃肿的稀疏网络可能被不失性能地简化。 虽然数学证明有着严格的条件限制,但Hebbian定理有力地支持了这一结论。 由于计算机软硬件对非均匀稀疏数据的计算效率很差,所以在AlexNet模型重新启用了全连接层,其目的是为了更好地优化并行运算。所以,现在的问题是否有一种方法,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。事实上可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,具体方法是采用将多个稀疏矩阵合并成相关的稠密子矩阵的方法来提高计算性能,Google团队沿着这个思路提出了名为Inception 结构来实现此目的。
二、Inception 结构 2.1 Inception模型 A Inception结构的主要思想是找出如何让已有的稠密组件接近与覆盖卷积视觉网络中的最佳局部稀疏结构。有文献提出一个层与层的结构,在结构的最后一层进行相关性统计,将高相关性的聚集到一起。这些聚类构成下一层的单元,且与上一层单元连接。假设前面层的每个单元对应于输入图像的某些区域,这些单元被分为滤波器组。低层的单元集中在某些局部区域,最终得到在单个区域中的大量聚类,它们能在下一层通过1×1的卷积覆盖。 总的来说,Inception结构的主要思路是用密集成分来近似最优的局部稀疏结构。Google团队首先提出来的是Inception模型A,如下图所示:
这个模型意在强化基本特征提取模块的功能,一般的卷积层只是增加卷积层的深度和个数,但是在单层上卷积核却只有一种,比如对于VGG,单层卷积核只有3×3大小的,这样特征提取的功能可能就比较弱。GoogLenet想的就是能不能增加单层卷积层的宽度,即在单层卷积层上使用不同尺度的卷积核,如上图所示基本的Inception module中有1×1卷积核,3×3卷积核,5×5卷积核还有一个3×3下采样。这样尺寸不同的卷积核就可以提取不同尺寸的特征,单层的特征提取能力增强了。 但是此时会有个疑问,对于像VGG这种网络,自己同样可以通过卷积-下采样-卷积这种方式提取不同尺寸的信息,所以为什么Inception module这种网络会有很好的效果的,具体的原因是采用卷积-下采样-卷积这种方式虽然能够提取不同尺寸的信息,但是由于是通过下采样这种方式实现的,所以必会带来信息的丢失,和Inception module这种方式相比,显然丢失的信息更多。 针对上面的模型进行一下注释: (1)采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合; (2)之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了; (3)很多文献都表明pooling挺有效,所以Inception模型嵌入了poolong层; (4)网络越到后面,特征越抽象,空间集中性会降低,所以每个特征所涉及的感受野需要更大,因此随着层数的增加,3×3和5×5卷积的比例也要增加。 2.2 Inception模型 B 上面Inception module A结构会存在一个问题,就是前一层的输出不经任何处理直接输入到下一层的卷积层中,这样如果前一层的特征图数量很多,有经过5×5这种大尺寸的卷积,带来的计算量也是非常大,所以在修正过后的Inception module在输出到下一层卷积之前,会对数据进行一次降维,那么怎么来实现数据降维,方法是采用1×1卷积核来实现。例如:上一层的输出为100x100x128,经过具有256个输出的5×5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1×1卷积层,再经过具有256个输出的5×5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。 改进后的 Inception模型B如下图所示:
改进后的Inception module既能大大提升卷积提取特征的能力,又不会使计算量提升很多。实验表明,采用了Inception模块的网络要比没有采用Inception模块的同样架构的网络快2~3倍。
三、GoogLeNet模型 GoogLeNet共有22层,原始输入数据的大小为224*224*3。 GoogLeNet 网络结构如下图所示:
GoogLeNet网络模型参数变化如下图所示:
总体结构: (1)包括Inception模块的所有卷积,都用了修正线性单元(ReLU); (2)网络的感受野大小是224×224,采用RGB彩色通道,且减去均值; (3)#3×3 reduce和#5×5 reduce分别表示3×3和5×5的卷积前缩减层中1×1滤波器的个数;pool proj表示嵌入的max-pooling之后的投影层中1×1滤波器的个数;缩减层和投影层都要用ReLU; (4)网络包含22个带参数的层(如果考虑pooling层就是27层),独立成块的层总共有约有100个; (5)网络中间的层次生成的特征会非常有区分性,给这些层增加一些辅助分类器。这些分类器以小卷积网络的形式放在Inception(4a)和Inception(4b)的输出上。在训练过程中,损失会根据折扣后的权重(折扣权重为0.3)叠加到总损失中。
四、GoogLeNet模型特点 GoogLeNet模型采用了Inception结构,不仅进一步提升了预测分类的准确率,而且极大的减小了参数量,分析其原因如下: (1)GoogLeNet采用了模块化的结构,方便增添和修改; (2)网络最后采用了average pooling来代替全连接层,但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune; (3)虽然移除了全连接,但是网络中依然使用了Dropout ; (4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。 本文的主要想法其实是想通过构建密集的块结构来近似最优的稀疏结构,从而达到提高性能而又不大量增加计算量的目的,上面的这些模型特点很好的实现了这个想法。GoogleNet的caffemodel大小约50M,性能很优异。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170445.html原文链接:https://javaforall.cn