GoogLeNet实现的过程
这里以Inception模块构建的GoogLeNet(Inception v1)为例,描述GoogLeNet的实现过程。
(1)输入层
原始输入图像大小为224×224×3,为三通道RGB图像。
(2)卷积层
接收224×224×3的矩阵数据,与64个大小为7×7的卷积核(步长为2,padding为“SAME”)做运算,输出为112×112×64,经过3×3的最大值池化(步长为2),输出矩阵为56×56×64。
(3)卷积层
接收56×56×64的矩阵数据,与192个大小为3×3的卷积核(步长为1,padding为“SAME”)做运算,输出为56×56×192,经过3×3的最大值池化(步长为2),输出矩阵为28×28×192。
(4)Inception 3a层
接收28×28×192的矩阵数据,共4个分支,采用不同尺度的卷积核运算,4个分支步长都为1。
第一个分支:与64个大小为1×1的卷积核做运算,输出矩阵为28×28×64。
第二个分支:与96个大小为1×1的卷积核做运算,输出为28×28×96,再与128个大小为3×3的卷积核(padding为“SAME”)做运算,输出矩阵为28×28×128。
第三个分支:与16个大小为1×1的卷积核做运算,输出为28×28×16,再与32个大小为5×5的卷积核(padding为“SAME”)做运算,输出矩阵为28×28×32。
第四个分支:3×3的最大值池化(padding为“SAME”),输出为28×28×192,32个大小为1×1的卷积核,输出矩阵为28×28×32。
将4个分支进行纵向拼接,层数为64+128+32+32=256,所以输出矩阵为28×28×256。
(5)之后的层
以后的层数都以此类推,GoogLeNet模型有9个堆叠的Inception模块,共有22层(如果包括池化层,则是27层)。由于GoogLeNet模型层数比较多,会造成梯度消失的问题,所以,为了阻止梯度消失,在网络中加入了两个辅助分类器。辅助分类器对网络中的两个Inception模块进行了softmax操作,得到的这两个Inception模块的损失,称为辅助损失。总的损失等于最后得到的损失与辅助损失之和,辅助损失仅在训练时使用,在预测过程中不使用。
除了GoogLeNet实现的Inception v1外,还有其他Inception版本,每一个Inception版本的发布都带来了准确率的提升。