1. 前言
GoogleNet 网络是14年由 Google 团队提出,斩获该年 ImageNet 竞赛中 Classification Task(分类任务)第一名,原论文《Going deeper with convolutions》
2.网络中的亮点
- 引入Inception结构(融合不同尺度的特征信息)
- 使用1*1的卷积进行降维以及映射处理
- 添加两个辅助分类器帮助训练
- 丢弃全连接层使用平均池化层(大大减少模型的参数)
3. 网络结构
3.1 Inception结构
Inception 最初提出的版本主要思想是利用不同大小的卷积核实现不同尺度的感知,采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合,网络结构图如下:
上图是一开始的版本,它是由11卷积,33卷积,55卷积,33最大池化组成,然后对四个部分的运算结构进行通道上的整和(即利用不同大小的卷积核实现不同尺度的感知,最后进行融合,可以得到图像更好的表征)
- 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了
- 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加
但是这样的结构还是存在问题:
- 首先,所有卷积层直接和前一层输入的数据对接,所以卷积层中的计算量会很大
- 其次,在这个单元中使用的最大池化层保留了输入数据的特征图的深度,所以在最后进行合并时,总的输出的特征图的深度只会增加,这样增加了该单元之后的网络结构的计算量
所以又出现了第二个版本,通过减少参数量去减少计算量,使用1x1 卷积核进行压缩降维,减少参数量,从而让网络更深、更宽,更好的提取特征,这种思想也称为Pointwise Conv,简称PW。如下图所示:
- 由于1*1卷积的加入,特征图的深度也降低了,这样也降低了该单元之后的网络结构的计算量
- 附加1*1卷积降维原理
3.2 辅助分类器
根据实验数据,发现神经网络的中间层也具有很强的识别能力,为了利用中间层抽象的特征,在某些中间层中添加含有多层的分类器。如下图所示,红色边框内部代表添加的辅助分类器。GoogLeNet中共增加了两个辅助的softmax分支,作用有两点,一是为了避免梯度消失,用于向前传导梯度。反向传播时如果有一层求导为0,链式求导结果则为0。二是将中间某一层输出用作分类,起到模型融合作用。最后的loss=loss_2 + 0.3 * loss_1 + 0.3 * loss_0。实际测试时,这两个辅助softmax分支会被去掉。
原文链接:https://blog.csdn.net/qq_37555071/article/details/108214680
3.3 GoogleNet网络结构(Inception V1)分析
-
GoogleNet网络有22层深(不加pooling),无论是VGG,LeNet还是AlexNet在输出方面军事采用三个全连接层,全连接层的输入是经过前面卷积层reshape后得到的,然而GoogleNet采用平均池化层代替全连接层,top1-accuracy 提高了0.6%,但是依然使用dropout,在Dropout前使用AveragePool,一方面是降维,另一方面则是整合了底层特征,因为我们希望在高层能够抽象出图像的全局的特征,所以我们在高层增加卷积核和池化区域的大小,前面卷积核大小固定是为了计算方便。
-
GoogLeNet在网络模型方面与AlexNet、VGG还是有一些相通之处的,它们的主要相通之处就体现在卷积部分,
- AlexNet采用5个卷积层
- VGG把5个卷积层替换成5个卷积块
- GoogLeNet采用5个不同的模块组成主体卷积部分
用表格的形式表示GoogLeNet的网络结构如下所示:
上图表中数据于Inception对应关系
原始输入图像为224x224x3
-
conv1 :kernel_size = 77,stride = 2,padding = 3,卷积核数量 = 64,输出特征图尺寸为(224-7+32)/2+1=112.5(向下取整)=112,输出特征图维度为112x112x64,卷积后进行ReLU操作。
-
pooling1 : patch_size = 3*3 , stride = 2, 输出特征图尺寸为((112 -3)/2)+1=55.5(向上取整)=56,输出特征图维度为56x56x64,2
-
conv2,3 :对应表中第三行,因为depth是2,所以代表有两个卷积层。
- 先用64个1x1的卷积核(3x3卷积核之前的降维)将输入的特征图(56x56x64)变为56x56x64,然后进行ReLU操作。参数量是1164*64=4096
- 再用卷积核大小33,步长为1,padding为1,输出通道数192,进行卷积运算,输出特征图尺寸为(56-3+12)/1+1=56,输出特征图维度为56x56x192,然后进行ReLU操作,参数量是3364*192=110592。
-
pooling2:窗口大小3*3,步长为2,输出通道数192,输出为((56 - 3)/2)+1=27.5(向上取整)=28,输出特征图维度为28x28x192
-
Inception3a:
上图表中数据于Inception对应关系
使用64个1x1的卷积核,运算后特征图输出为28x28x64,然后RuLU操作。参数量11192*64=12288- 96个1x1的卷积核(3x3卷积核之前的降维)运算后特征图输出为28x28x96,进行ReLU计算,再进行128个3x3的卷积,输出28x28x128。参数量1119296+3396128=129024
- 16个1x1的卷积核(5x5卷积核之前的降维)将特征图变成28x28x16,进行ReLU计算,再进行32个5x5的卷积,输出28x28x32。参数量1119216+551632=15872
- pooling层,使用3x3的核,输出28x28x192,然后进行32个1x1的卷积,输出28x28x32.。总参数量11192*32=6144
- 将四个结果进行连接,对这四部分输出结果的第三维并联,即64+128+32+32=256,最终输出28x28x256。总的参数量是12288+129024+15872+6144=163328
-
Inception 3b,4a,4b,4c,4e,5a,5b均与Inception3a相同的处理方式;
-
输出层:GoogLeNet与AlexNet、VGG采用3个连续的全连接层不同,GoogLeNet采用的是全局平均池化层,得到的是高和宽均为1的卷积层,然后添加丢弃概率为40%的Dropout,输出层激活函数采用的是softmax