GoogLeNet(inceptionNet)是Christian Szegedy等人提出来的,目前,Christian Szegedy在Google从事人工智能领域的研究。GoogLeNet获得了2014年ImageNet挑战赛(ILSVRC14)的第一名,VGG获得了第二名。
据说之所以取名GoogLeNet而不是GoogleNet是为了向CNN的开山之作LeNet致敬。
目录
1、Motivation
提高神经网络性能的最直接的方法就是增加其规模。这包括增加深度:网络层数。和宽度:神经元数量。但是,这种简单的方法有一些问题,比如参数大量增加、overfit、梯度消失、梯度爆炸等。解决这些问题的方法就是在增加网络深度和宽度的同时减少参数,这就引入了稀疏连接,将全连接变成稀疏连接。但是全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。GoogLeNet就是基于此提出的。
接下来看一下GoogLeNet的论文《Going Deeper with Convolutions》
2、Architectural Details
inception结构的主要思想是考虑卷积视觉网络的最优局部稀疏结构如何被容易获得的稠密分量逼近和覆盖。
图(a)是提出的最原始的结构,主要特点有:
不同尺度的卷积核具有不同大小的感受野,能提取到不同尺度的特征。不同尺度的卷积核如何拼接到一起可以通过设定合适的stride和pad来实现。比如这里卷积核分别为1x1,3x3,5x5,stride=1,pad=0,1,2就可以了。
而引入池化层是因为考虑到目前池化在CNN中所取得的成功。
到这里,就可以看到由特点尺度卷积核提取的特征矩阵是稀疏矩阵(即大多数特征为0的矩阵),但是不同尺度卷积核提取的特征聚集在一起则形成了密集矩阵。随着更高层次的特征被捕获,它们的空间集中度预计会降低。这表明随着网络向更高层移动,3×3和5×5卷积的比率应该增加。
图(a)的结构的一个缺点是计算量太大。例如:上一层的输出为100x100x128,经过5x5卷积层之后(stride=1,pad=2)输出256个特征图,输出数据为100x100x256。那么,这次卷积的参数为128x5x5x256。但是,如果上一层输出先经过1x1卷积核输出32个特征图,再经过5x5卷积核输出256个特征图,那么最终的输出特征仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。
于是引入了图(b),使用1x1卷积核进行降维,同时,由于每个卷积之后都使用了ReLu,特征的非线性更好。
3、GoogLeNet
GoogLeNet结构如上图所示
① 采用了模块化的结构,方便增添和修改;
② 网络最后采用了average pooling来代替全连接层。而average pooling层之后的FC层,主要是为了方便finetune;
③虽然移除了全连接,但是网络中依然使用了Dropout ;
④训练的时候,为了避免梯度消失,额外增加了2个辅助的softmax用于向前传导梯度。这相当于做了模型融合,同时辅助分类器的Loss会设置一个权重系数,比如0.3。而测试的时候,会去掉额外的softmax。