勘误:开始之前说一下,昨天介绍的环境搭建的那篇,里面我忘记写cudnn的安装说明了,只贴了在哪下载,我在word版里面已经更新了,欢迎需要的童鞋下载查看。还有一个是,里面的sudo和后面的命令连在一起了,sudo的意思是相当于Windows里面的获取管理员权限,输入之后,它会让你输入一个密码,就是安装的时候,你设置的密码,但是你输入之后是不显示的,这是Linux的安全性的体现,别以为你没输进去哈。好了就这么多,抱歉!
**************分割线**************
前面介绍了Alexnet,比较经典的模型,还差好几个,但是我这些理解的也不深,最关键的是有很多人比我讲的好。囧。但是基于对大神们的敬仰和如此优秀的架构崇拜之情,让更多人知道世界上优秀的思想,我觉得是新世纪大学生(以及勤劳勇敢的Chinese)义不容辞的责任。今天我把GoogLeNet介绍给各位看官,各位会不会介绍给你的伙伴呢?(./奸笑)
GoogLeNet之所以叫做GoogLeNet,而不是googleNet,是因为Google的科学家们对LeNet的崇拜,以此来纪念LeNet的伟大发明。LeNet的发明是当初为了解决支票上手写数字的识别问题,可想而知,当时的准确率已经很高了。LeNet也比较简单,只要你理解了卷积,再去看那个应该就不难了。
好,下面开始今天的猪脚,GoogLeNet,主要介绍一下其中我认为比较重要的点。
论文地址:https://arxiv.org/abs/1409.4842
贴图的目的只想说,这孩子名字取得真好!Going deeper with Convolutions,更深的卷积。GoogLeNet告诉我们,卷积神经网络没有最深,只有更深。因为理论上来说,越深的网络可以学习到的特征越多,这样就有利于分类。插一张神图,哈哈哈。
GoogLeNet是2014年ImageNet比赛的冠军,第二名是VGG。ImageNet是一个计算机视觉领域的比赛,主要有分类和检测两个任务。而我们反复说的这几个模型都是ImageNet比赛上的第一名,或者第二名。对于分类任务来说,一般会选择top5,top1错误率来说明。一般的介绍,会直接给出每种模型的top5,top1错误率的值是多少,但是你清楚top5,top1是怎么算出来的吗?
这里我来解释一下什么是top5,top1。ImageNet的分类任务中,一般会给1000个类别,比如飞机,人,车,动物,树等等等等。要求是把每一种类别都正确区分,这样最后提交的结果中,就会有1000个概率值,然后比如从大到小排序一下,就是这样的:
0.98,0.95,0.93,0.89,0.86,0.81。。。
然后
tpo5=1-(0.98+0.95+0.93+0.89+0.86)/5=0.077999=7.8%
top1= 1-0.98=0.02=2%
这就是top5,top1的意思。下面是论文中的一张历年的top-5错误率的对比。
Inception Module
GoogLeNet的那张图巨长无比,这里我找了一个稍微短一点的图,先大概浏览一下,注意左下角的说明,不同的颜色代表不同的结构。GoogLeNet主要包括卷积,池化,concat(级联),Dropout,全连接,最后是softmax。
然后我们看一下绿色框里面的那部分,拿出来看看就是下面这个样子。这个东西叫做Inception,也叫Inception V1,因为发展到今天已经有了V2,V3,V4了。
这里注意箭头的方向,最下面的是输入层,由下往上的输出。卷积核的大小由1x1,3x3到5x5。使用Inception结构的作用是为了提取更多的特征,GoogLeNet中一共使用了9个Inception,这样下来模型一共达到了100个layer。太机智了!这种network in network(网中网)的结构可以非常好的提取到像素的细节特征,其中5x5的卷积可以覆盖输入中较大的输入区域。但是这样带来的问题是参数量的增加和容易过拟合,而机智的作者怎么会没想到这个问题呢,所以他们在每个Inception结构结束之后加了一个max pooling。Pooling的作用是减小模型的大小,降低过拟合的风险。Inception结构在Pooling之前还加了Relu激活函数,这个可以提高网络的非线性。做了这么多工作其实主要就是为了在增加模型深度的前提下,尽量减小模型的计算量,也就是说,你不能一味的追求网络的深度而不考虑内存,GPU的限制吧!
最后要说一下,里面1x1的卷积核的作用,1x1的卷积核可以降低模型维度,那为什么不用3x3,或者5x5的卷积核呢?这是因为3x3和5x5的卷积核做不到(臣妾做不到呀!)下面这个图是上图的一个naïve版本。
然后我找了张比较形象的图来说明一下具体的细节。直接看图,应该能看懂。
下面我们划一下重点:
1. 使用9个Inception结构,达到了使用100层的效果。
2. 使用average pooling均值池化,代替全连接,这样由7x7x1024变到了1x1x1024,这样做可以大大减少参数量。
3. GoogLeNet的参数量大约是AlexNet的1/12.
4. 在检测任务中,GoogLeNet使用了R-CNN的思想。 R-CNN后面我可能会另外介绍一下。
5. Inception结构有很大的改进空间,目前貌似到了V6,v7了。
6. GoogLeNet的训练时间在普通的GPU上仅用了一周的时间,这里大概可以体会一下GoogLeNet的牛逼的地方,不要觉得一周的时间很久,像这么深的网络结构,能做到一周很不错了。一般随便跑个模型不得一两天的。
最后发散一下,贴几个Inception发展到现在比较先进的结构,体会一下大神的思想。(仅仅是体会一下就好)
[参考文献]
1.https://adeshpande3.github.io/The-9-Deep-Learning-Papers-You-Need-To-KnowAbout.html
2.https://leonardoaraujosantos.gitbooks.io/artificialinteligence/content/googlenet.html
3.http://www.cnblogs.com/52machinelearning/p/5821591.html
本文为作者原创,如有雷同,必然是别人抄我的。