智能图像识别初探系列(四)

神经网络的一个比较严重的问题就是过拟合问题,在AlexNet论文中采用的数据扩充和Dropout的方法处理过拟合问题。

Data Augmentation(数据扩张,就是对原始数据做一些变化)数据扩充是防止过拟合的最简单的方法,只需要对原始的数据进行合适的变换,就会得到更多有差异的数据集,防止过拟合。

DropoutDropout背后有很多有意思的东西,但是在这里我们不需要了解太深,只需要知道Dropout是在全连接层中去掉了一些神经节点,达到防止过拟合的目的,我们可以看上面的图在第六层和第七层都设置了Dropout。

VGG提出了相对AlexNet更深的网络模型,并且通过实验发现在一定范围内网络越深性能越好。VGG包含两种结构,分别为16层和19层。

从图中可以看出,VGGNet结构中,所有的卷积层使用了更小的卷积核(3x3),stride为1,同时不单单使用卷积层,而是组合成了“卷积组”,即一个卷积组包括2-4个3x3卷积层(a stack of 3x3 conv),有的层也有1x1卷积层,因此网络更深,这样,更深的网络结构就会学习到更复杂的非线性关系,从而使得模型效果更好。

在池化层上面,VGGNet使用2x2的max pooling,在full-image测试时候把最后的全连接层(fully-connected)改为全卷积层(fully-convolutional net),重用训练时的参数,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为的输入。

另外VGGNet卷积层有一个显著的特点:特征图的空间分辨率单调递减,特征图的通道数单调递增,这是为了更好地将HxWx3(1)的图像转换为1x1xC的输出,之后的GoogLeNet与ResNet都是如此。上图为VGG不同版本的网络模型,较为流行的是VGG-16,与VGG-19。

第三种网络结构就是GoogLeNet,GoogLeNet是谷歌(Google)研究出来的深度网络结构,为什么不叫“GoogleNet”,而叫“GoogLeNet”,据说是为了向“LeNet”致敬,因此取名为“GoogLeNet”。

2014年,GoogLeNet和VGG是当年ImageNet挑战赛(ILSVRC14)的双雄,GoogLeNet获得了第一名、VGG获得了第二名,这两类模型结构的共同特点是层次更深了。VGG继承了LeNet以及AlexNet的一些框架结构,而GoogLeNet则做了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比AlexNet和VGG小很多,GoogLeNet参数为500万个,AlexNet参数个数是GoogLeNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogLeNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。

我们知道要想获得高质量模型最保险的做法就是增加模型的深度(层数)或者是其宽度(层核或者神经元数),但是这里一般设计思路的情况下会出现如下的缺陷:

参数太多,若训练数据集有限,容易过拟合;网络越大计算复杂度越大,难以应用;网络越深,梯度越往后穿越容易消失,难以优化模型。解决上述两个缺点的根本方法是将全连接甚至一般的卷积都转化为稀疏连接。为了打破网络对称性和提高。

GoogLeNet最初的想法很简单,就是如果想要得到更好的预测效果,就要增加网络的复杂度,即网络深度和网络宽度两方面。但这样就会有明显的问题。首先,更复杂的网络意味着更多的参数,就算是ILSVRC这种包含了1000类标签的数据也很容易过拟合。

其次,更复杂的网络会带来更大的计算资源的消耗,而且当kernel个数设计不合理导致kernel中的参数没有被完全利用时,会导致大量计算资源的浪费。解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。

但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。

大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,就如人类的大脑是可以看做是神经元的重复堆积。

因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。这里面涉及大量的数学推导和原理,在本章节中我们用一种简单的方式解释inception设计的初衷。

首先,神经网络的权重矩阵是稀疏的,如果能将图中左边的稀疏矩阵和2x2的矩阵卷积转换成右边2个子矩阵和2x2矩阵做卷积的方式则会大大降低计算量。那么,同样的道理,应用在降低卷积神经网络的计算量上就产生了如图的inception结构。

这个结构是将256个均匀分布在3x3尺度的特征转换成多个不同尺度的聚类,如96个1x1、96个3x3和64个5x5分别聚在一起,这样可以使计算更有效,收敛更快。但是这种结构仍然有较大的计算量,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception的网络结构。

那么这个1x1的卷积核有什么作用呢?1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后,输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。

而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。

除了Inception结构,GoogLeNet的另外一个特点是主干网络部分全部使用卷积网络,仅仅在最终分类部分使用全连接层。

成都柏原摄影服务有限公司
Photography
咨询热线
028-83336379
在线预约
TOP