简介:
本文开始对Inception系列模型进行解读
GoogLeNet(Inception v1)
从AlexNet到VGG模型,一直都在关注模型深度,深度的不断增加会带来一系列问题:
- 参数量爆炸
- 容易发生过拟合
- 梯度消失,难以优化
因此Inception作者开始关注模型广度问题:
图片a是朴素的想法,也就是通过多尺度并行卷积来提取不同的特征,即同时使用不同尺寸的卷积核,有33,55,1*1以及直接池化,通过这些不同尺寸的卷积核提取不同的特征,增加了特征的多样性。
为了减少参数量,作者引用了Network in Network这篇论文当中的1×1卷积操作,不了解的可以参见我的另一个博客1×1卷积作用,得到b图片的内容,这样做既减少了参数量,还在一定程度上增加了模型的深度,提高了非线性表达能力
直观地看一下该操作:
对上图做以下说明:
1 . 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
2 . 之所以卷积核大小采用1×1、3×3和5×5,主要是为了方便对齐。设定卷积步长stride=1之后,
只要分别设定padding =0、1、2,采用same卷积可以得到相同维度的特征,然后这些特征直接拼接在一起;
3 . 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了pooling。
4 . 网络越到后面特征越抽象,且每个特征涉及的感受野也更大,随着层数的增加,3x3和5x5卷积的比例也要增加。
下面图片是网络整体参数情况,可以看到作者在模型的最后使用了全局平均池化来代替了原来广泛使用的全连接层,因为之前网络模型的大部分参数都集中在全连接层,参数多且容易过拟合。使用全局平均池化可以减少参数量,并且从params这一栏可以看到,参数量分布相对比较集中,能够让模型在每一层充分训练,而不是像以前的模型那样集中到全连接层进行训练。
全网络使用了9个以上的Inception模块
对于上图的几点说明:
显然GoogLeNet采用了Inception模块化(9个)的结构,共22层,方便增添和修改;
网络最后采用了average pooling来代替全连接层,想法来自NIN,参数量仅为AlexNet的1/12,性能优于AlexNet,
事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便finetune;
虽然移除了全连接,但是网络中依然使用了Dropout ;
有三个辅助分类器(绿色框框),论文中解释这样做的好处是避免梯度的消失,使得方向传播能够进行,并且相当于做了一个Ensemble,模型的一个集成,此外,实际测试的时候,这两个额外的softmax会被去掉。