从Inception V1 到 Inception V4 网络结构的变化
最近在学习Inception系列的网络,把自己的总结一下。
2014年GoogleNet(论文地址)取得了第一名,和VGG网络同年,那时候的Inception Net称为V1版本,我们来看一下Inception V1的Inception module。
这个左边的是一般的版本,右边的是改进的版本,首先解释一下这种Inception module的好处,从Alexnet到VGG,网络层次不断增加,深度不断增加,但是却忽视了广度上的增加,而Inception就是在广度上增加,同时使用不同的卷积核大小,3*3,5*5,1*1,这些不同卷积核的提取不同的特征,增加了特征的多样性,但是这样带来一个问题就是参数量增加太大,为了解决这个问题,就引入了1*1的卷积降维,所有右边就是使用了1*1的卷积降维了。这就是右边对左边的改进。
然后我们看GoogleNet,他除了有Inception module外,还有一个特点是他有三个输出,论文中解释这样做的好处是避免梯度的消失,使得方向传播能够进行,但是还有一个作用就是,这样有三个输出的好处是,相当于可以做一个Ensemble,模型的一个集成,我们知道Kaggle中这个技巧是必用的。而且我们知道,越靠前的层卷积提取的特征越低层次的特征,越靠后的卷积层的特征越高层次,如果只有最有一层的输出,也就是相当于只用了最后的高层次的特征分类,但不一定这样就好,所以GoogleNet使用三个输出,也是使用了不同层次的特征的输出作为分类,这样考虑更加周全。
GoogleNet还有一个减少参数量的方法是,他去掉了FC层,用average Pooling来代替,相比VGG网络和AlexNet网络,几乎所有的参数有耗费在FC层上。
Inception V2
Inception V2做了一个改进就是使用3*3的卷积代替5*5的卷积核,实验证明这样并不影响结果,但是却减少了参数量,假设输入和输出通道数都是C,那么5*5的卷积核参数量为25C^2,但是两个3*3的卷积核参数量为18C^2,同时因为使用两个3*3,使得网络层次加深,增加了非线性,提高了模型的表达能力。结果后如下图
还有一个相比Inception V1的改进是,Inception V2 开始引入了BN层。BN层的好处再次不叙述,相信大家都知道。
Inception V3(和Inception V2 一篇文章中讨论)
首先看他的改进:
从图上我们可以看出,Inception V3使用了7*1和1*7的卷积代替7*7,5*1核1*5代替5*5,总结起来就是,Inception V3就是使用两个1*n和n*1的卷积核取代n*n的卷积核。这样做,相比把5*5用两个3*3代替更加参数量少,加速了网络的变化。同时增加了一层非线性扩展模型表达能力。论文解释说,这种非对称的卷积结构拆分,其结果比对称地拆为几个相同的小卷积核效果更明显,可以处理更多、更丰富的空间特征,增加特征多样性。
Inception V4
Inception V4其实就是使用了不同的 Inception Block,具体我们看论文给出的图
就是这几个Inception Block,然后堆叠成Inception V4,成了下图
仔细观察就会发现,依旧每个Inception Block都使用了1*1的卷积,之前讲过这样是为了降维,同时也是增加非线性提高模型的表达能力。其中Inception-A就是上面第一幅图,以此类推。其实就是得到输出为17*17的Inception Block,和得到35*35的Inception Block,的等等。
Inception-Resnet
这个就是融合微软的残差网络的思想,就是把残差的思想引入进来,就是Inception resnet网络了。做法见下图。
其实就是多了一个直连边,
最终网络堆叠成了:
所以Inception-resnet的好处肯定是和残差相关,融合了残差神经网络的优点。