原作者:lynnandwei 原文地址:http://blog.csdn.net/lynnandwei/article/details/44458033
GoogLeNet,2014年ILSVRC挑战赛冠军,将Top5的错误率降低到6.67%。一个22层的深度网络,论文在http://arxiv.org/pdf/1409.4842v1.pdf,题目为:with convolutions。(每次看这么简洁优雅的题目,就想吐槽国内写纸的八股文题目).GoogLeNet这个名字也是挺有意思的,为了像开山鼻祖的LeNet网络致敬,他们选择了这样的名字。
BVLC在caffe中给出了网络的实现:https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet
模型下载地址:http : //dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel
从论文里整理了一张这个22个层次的模型的图出来(如果考虑pooling layer是27层),先将模型跑了一遍结果,还是那只猫:
直观输出是如下,
[287 281 285 282 283]
['n02127052 lynx,catamount''n02123045 tabby,tabby
cat''n02124075 Egyptian cat''n02123159 tiger cat''n02123394 Persian cat']
caffe的实现和原来论文的模型是有不同的:
不是用重新点亮数据增加训练;
不是用尺度或纵横比数据增加训练;
使用“xavier”初始化权重,而不是“gaussian”;
quick_solver.prototxt使用不同于原始solver.prototxt的学习速率衰减策略,允许更快的训练(60个纪元和250个纪元);
捆绑模型是使用quick_solver.prototxt的迭代2,400,000个快照(60个纪元)
但是准确度还是达到了顶1精度68.7%(31.3%误差)和前5精度88.9%(11.1%误差)
我们来分析一下这个模型的层次关系:
原始数据,输入为224 * 224 * 3
第一层卷积层conv1,pad是3,64个特征,7 * 7步长为2,输出特征为112 * 112 * 64,然后进行relu,经过pool1(红色的最大池)进行pooling 3 * 3的核,步长为2,[(112 - 3 + 1)/ 2] +1 = 56特征为56 * 56 * 64,然后进行norm
第二层卷积层conv2,pad是1,3 * 3,192个特征,输出为56 * 56 * 192,然后进行relu,进行norm,经过pool2进行pooling,3 * 3的核,步长为2输出为28 * 28 * 192然后进行split分成四个支线
第三层开始时候模块,这个的思想受到使用不同尺度的Gabor过滤器来处理多尺度问题,inception module采用不同尺度的卷积核来处理问题.3a包含四个支线:
1:64个1 * 1的卷积核(之后进行RULE计算)变成28 * 28 * 64
2:96个1 * 1的卷积核作为3 * 3卷积核之前的减少,变成28 * 28 * 96,进行relu计算后,再进行128个3 * 3的卷积, 28 * 28 * 128
3:16个1 * 1的卷积核作为5 * 5卷积核之前的减少,变成28 * 28 * 16,进行relu计算后,再进行32个5 * 5的卷积,变成28 * 28 * 32
4:池层,3 * 3的核,垫为1,输出还是28 * 28 * 192,然后进行32个1 * 1的卷积,变成28 * 28 * 32。
将四个结果进行连接,输出为28 * 28 * 256
然后将3a的结果又分成四条支线,开始建立3b的开始模块
3b
1:128个1 * 1的卷积核(之后进行RULE计算)变成28 * 28 * 128
2:128个1 * 1的卷积核作为3 * 3卷积核之前的减少,变成28 * 28 * 128,再进行192个3 * 3的卷积,垫为1,28 * 28 * 192 ,进行relu计算
3:32个1 * 1的卷积核作为5 * 5卷积核之前的减少,变成28 * 28 * 32,进行relu计算后,再进行96个5 * 5的卷积,变成28 * 28 * 96
4:池层,3 * 3的核,垫为1,输出还是28 * 28 * 256,然后进行64个1 * 1的卷积,变成28 * 28 * 64。
将四个结果进行连接,输出为28 * 28 * 480
同理依次推算,数据变化如下表:
一部分输出结果如下:
I0319 22:27:51.257917 5080 net.cpp:208]这个网络产生输出故障
材料集合:
http://deeplearning.net/2014/09/19/googles-entry-to-imagenet-2014-challenge/
[1] Imagenet 2014 LSVRC结果, http : //karpathy.github.io/2014/09/02/what-i-learned-from-competing-against-a-convnet-on-imagenet/,最后检索:19 -09-2014。
[2] Christian Szegedy,Wei Liu,Yangqing Jia,Pierre Sermanet,Scott Reed,Dragomir Anguelov,Dumitru Erhan,Vincent Vanhoucke,Andrew Rabinovich,Going Deeper with Convolutions,Arxiv链接:http : //arxiv.org/abs/1409.4842。
[3] GoogLeNet演示, http ://image-net.org/challenges/LSVRC/2014/slides/GoogLeNet.pptx,最后检索的:19-09.2014。
[4]我从竞争对手的网络上学到的东西, http://karpathy.github.io/2014/09/02/what-i-learned-from-competing-against-a-convnet-on-imagenet /最后检索日期:19-09-2014。
[5] Girshick,Ross,et al。“丰富的特征层次结构,用于精确的对象检测和语义分割。” arXiv preprint arXiv:1311.2524 (2013)。