【12】inception网络模型
参考:https://www.cnblogs.com/dengshunge/p/10808191.html
Inception v1
在Inception v1中主要介绍如何在有限的计算资源内,进一步提升网络的性能。提升网络的性能的方法有很多,例如硬件的升级,更大的数据集等。但一般而言,提升网络性能最直接的方法是增加网络的深度和宽度。其中,网络的深度只的是网络的层数,宽度指的是每层的通道数
这种方法会带来两个不足:
a) 容易发生过拟合。当深度和宽度不断增加的时候,需要学习到的参数也不断增加,巨大的参数容易发生过拟合。
b) 均匀地增加网络的大小,会导致计算量的加大
因此,解决上述不足的方法是引入稀疏特性和将全连接层转换成稀疏连接。这个思路的缘由来自于两方面:
1)生物的神经系统连接是稀疏的;
2)有文献指出:如果数据集的概率分布能够被大型且非常稀疏的DNN网络所描述的话,那么通过分析前面层的激活值的相关统计特性和将输出高度相关的神经元进行聚类,便可逐层构建出最优的网络拓扑结构。说明臃肿的网络可以被不失性能地简化。
但是,现在的计算框架对非均匀的稀疏数据进行计算是非常低效的,主要是因为查找和缓存的开销。因此,作者提出了一个想法,既能保持滤波器级别的稀疏特性,又能充分密集矩阵的高计算性能。有大量文献指出,将稀疏inception结构的主要思路是:矩阵聚类成相对密集的子矩阵,能提高计算性能。根据此想法,提出了Inception结构
借鉴NIN,采用1x1卷积核来进行降维,在inception结构中,大量采用了1x1的矩阵,主要是两点作用:
1)对数据进行降维;
2)引入更多的非线性,提高泛化能力,因为卷积后要经过ReLU激活函数
如何使用一个密集成分来近似或者代替最优的局部稀疏结构
GoogLeNet是由inception模块进行组成的
a)GoogLeNet采用了模块化的结构,方便增添和修改;
b)网络最后采用了average pooling来代替全连接层,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune;
c)虽然移除了全连接,但是网络中依然使用了Dropout;
d)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,但看源码中的model也没有加任何衰减。此外,实际测试的时候,这两个额外的softmax会被去掉。
finetune 就是用别人训练好的模型,加上我们自己的数据,来训练新的模型
Inception v2:
训练DNN网络的一个难点是,在训练时每层输入数据的分布会发生改变,所以需要较低的学习率和精心设置初始化参数。只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度。作者把网络中间层在训练过程中,数据分布的改变称之为:“Internal Covariate Shift”。因此,作者提出对数据做归一化的想法。主要采用BN算法进行归一化
Inception v3:
是来源于论文《Rethinking the Inception Architecture for Computer Vision》,主要是引入了因子分解的思想。
inception是通过增加网络的宽度来提高网络性能,在每个inception模块中,使用了不同大小的卷积核,可以理解成不同的感受野,然后将其concentrate起来,丰富了每层的信息。之后,使用了BN算法(BN使用在conv之后,relu之前),来加速网络的收敛速度。在V3版本中,还使用了卷积因子分解的思想,将大卷积核分解成小卷积,节省了参数,降低了模型大小。在V4版本中,使用了更加统一的inception模块,并结合了resnet的残差思想,能将网络做得更深。