经典网络GoogLeNet由Christian Szegedy等于2014年提出,论文名为《Going deeper with convolutions》,论文见:https://arxiv.org/pdf/1409.4842v1.pdf
GoogLeNet网络用到了Inception-v1模块,关于Inception模块的介绍可以参考:https://blog.csdn.net/fengbingchun/article/details/113482036
假如输入图像大小为n*n,过滤器(filter)为f*f,padding为p,步长(stride)为s,则输出大小为:计算卷积层大小,如果商不是整数,向下取整,即floor函数;计算池化层大小,如果商不是整数,向上取整,即ceil函数。参考:https://blog.csdn.net/fengbingchun/article/details/80262495
GoogLeNet网络:
(1).使用了1*1卷积核,减少feature map数。
(2).采用了模块化的结构(Inception-v1模块),方便增添和修改。
(3).网络最后采用全局平均池化(global average pooling)+全连接层+Softmax,而VGG和AlexNet最后使用连续3个全连接层+Softmax。
(4).为避免梯度消失,训练网络时额外增加了2个辅助分类器,辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重加到最终分类结果中。
GoogLeNet测试样本处理:
(1).对于每个测试样本,将图像的短边缩放到四种尺寸,分别为256、288、320、352;
(2).从每种缩放后的尺寸的测试样本中,截取图像的左、中、右方形区域(在肖像图像中截取上、中、下方形区域);
(3).对于截取后的每个方形区域,从4个角和中心分别截取一个224*224区域,再将此方形区域缩小到224*224;
(4).将每个获取的224*224图像进行水平翻转;
这样每个原始测试样本共得到4*3*6*2=144张图像。
GoogLeNet训练网络时架构(有22+5层),论文截图如下:
Caffe中GoogLeNet网络相关文件见:https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet
GoogLeNet推理网络架构:总共包含有9个Inception-v1模块,blvc_googlenet中deploy.prototxt,输入层shape为[10,3,224,224],即batch为10,这里调整为1
(1).输入层(Input):图像大小224*224*3。
(2).卷积层1+ReLU:使用64个7*7的filter,stride为2,padding为3,输出为112*112*64,64个feature maps。
(3).最大池化层1+LRN:filter为3*3,stride为2,padding为0,输出为56*56*64,64个feature maps。
(4).卷积层2+ReLU:使用64个1*1的filter,stride为1,padding为0,输出为56*56*64,64个feature maps。
(5).卷积层3+ReLU+LRN:使用192个3*3的filter,stride为1,padding为1,输出为56*56*192,192个feature maps。
(6).最大池化层2:filter为3*3,stride为2,padding为0,输出为28*28*192,192个feature maps。
(7).Inception-1:由左往右,最终输出并拼接为28*28*256,feature maps总数为64+128+32+32=256。
A.卷积+ReLU:使用64个1*1的filter,stride为1,padding为0,输出为28*28*64。
B.卷积+ReLU:使用96个1*1的filter,stride为1,padding为0,输出为28*28*96。然后再一次卷积+ReLU:使用128个3*3的filter,stride为1,padding为1,最终输出为28*28*128。
C. 卷积+ReLU:使用16个1*1的filter,stride为1,padding为0,输出为28*28*16。然后再一次卷积+ReLU:使用32个5*5的filter,stride为1,padding为2,最终输出为28*28*32。
D.最大池化:filter为3*3,stride为1,padding为1,输出为28*28*192。然后再卷积+ReLU:使用32个1*1的filter,stride为1,padding为0,最终输出为28*28*32。
(8).Inception-2:由左往右,最终输出并拼接为28*28*480,feature maps总数为128+192+96+64=480。
(9).最大池化层3:filter为3*3,stride为2,padding为0,输出为14*14*480,480个feature maps。
(10).Inception-3:由左往右,最终输出并拼接为14*14*512,feature maps总数为192+208+48+64=512。
(11).Inception-4:由左往右,最终输出并拼接为14*14*512,feature maps总数为160+224+64+64=512。
(12).Inception-5:由左往右,最终输出并拼接为14*14*512,feature maps总数为128+256+64+64=512。
(13).Inception-6:由左往右,最终输出并拼接为14*14*528,feature maps总数为112+288+64+64=528。
(14).Inception-7:由左往右,最终输出并拼接为14*14*832,feature maps总数为256+320+128+128=832。
(15).最大池化层4:filter为3*3,stride为2,padding为0,输出为7*7*832,832个feature maps。
(16).Inception-8:由左往右,最终输出并拼接为7*7*832,feature maps总数为256+320+128+128=832。
(17).Inception-9:由左往右,最终输出并拼接为14*14*1024,feature maps总数为384+384+128+128=1024。
(18).平均池化层5+Dropout:filter为7*7,stride为1,padding为0,输出为1*1*1024,1024个feature maps。
(19).全连接层:有1000个神经元或1000个feature maps。
(20).输出层(Softmax):输出分类结果,看它究竟是1000个可能类别中的哪一个。
可视化结果如下图所示:
GitHub:https://github.com/fengbingchun/NN_Test