VGGNet获得了2014年的ILSVRC分类比赛的亚军,而获得当年分类任务比赛冠军的则是GoogleNet。GoogleNet的参数量仅为AlexNet的1/12,但是分类精度却比AlexNet高得多。在ILSVRC分类任务中,GoogleNet使用7个模型集成,每张图片用144个随机裁剪的方法进行处理,达到了比VGGNet更高的分类精度,但7个模型总的参数量依然小于VGGNet。
与VGGNet模型相比较,GoogleNet模型的网络更深,如果只计算有参数的网络层,GoogleNet网络有22层,如果加上池化层的话则有27层,并且在网络架构中引入了Inception单元,从而进一步地提升了模型整体的性能。虽然GoogleNet的深度达到了22层,但参数量却比AlexNet和VGGNet小得多,GoogleNet参数总量约为500万个,而VGG16参数约为1.38亿个,是GoogleNet的27倍多。这归功于Google团队提出了Inception模块。
Inception的思想就是把多个卷积或池化操作,放在一起组装成一个网络模块,设计神经网络时以模块为单位去组装整个网络。图3.17所示为Inception模块最初的版本,其基本组成结构包含4个部分:1×1卷积、3×3卷积、5×5卷积以及3×3最大池化。分别经过这四个部分计算之后的结果,然后组合得到最终的输出。这就是Naive Inception(Inception最初版本),它的核心思想就是利用不同大小的卷积核实现不同尺度上的感知,获取不同的图像信息,最后再进行信息之间的融合,以便能够获得图像更好的特征,通过多措并举出实招,达到多管齐下求实效。
图3.17 Inception最初版本
但是,Naive Inception模块有两个问题:首先,所有卷积层直接和前一层输入的数据对接会造成卷积层中的计算量很大;第二,在这个模块中使用的最大池化层保留了输入数据的特征图的深度,所以在最后进行合并时,总的输出的特征图的深度只会增加,这样就增加了该模块之后的网络结构的计算量。因此,为了减少参数量以及减少计算量,Google团队提出了在GoogleNet模型中使用的Inception V1模块,其结构如图3.18所示。
图3.18 Inception V1模块
相较于Naive Inception模块,Inception V1模块加入了3个1×1卷积,其主要目的在于压缩降维、减少参数量,从而让整个网络更深、更宽、更好地提取图像特征,同时由于增加的1×1卷积也会有非线性激活函数,因此也提升了网络模型的表达能力。
GoogleNet的网络模型就是利用Inception V1模块搭建起来的,如图3.19(见文末插页)所示,总共有22层深,如果包括池化层,则总共有27层深。在进入分类器之前,采用平均池化(Average Pooling)来代替全连接层,而在平均池化之后,还是添加了一个全连接层,是为了能够在最后对网络模型做微调。由于全连接网络参数多,计算量大,容易过拟合,因此GoogleNet没有采用VGGNet、LeNet、AlexNet中都有的三层全连接层,而是直接在Inception模块之后使用Average Pool和Dropout方法,不仅起到了降维作用,还在一定程度上防止了过拟合。
此外,GoogleNet网络中还有两个用于前向传导梯度的Softmax函数,也就是辅助分类器,主要是为了避免梯度消失。这两个辅助分类器只在训练时使用,是为了网络模型的训练能够更稳定,能够收敛得更快,但是在模型进行预测时则会去掉这两个辅助分类器。
除了上述模型所用到的Inception V1模块,Google团队之后还提出了Inception V2模块以及Inception V3模块等,分别如图3.20和图3.21所示。
图3.20 Inception V2模块
图3.21 Inception V3模块