Inception模型中遇到的细节问题思考记录

声明:文章有部分内容为别人博客里面提到的,我觉得语言组织的很好所以就直接拿过来用了,如有侵权,请联系我删除或修改。


一、Inception v1(GoogleNet)

对左上图做以下说明: 
. 采用不同大小(1x1,3x3,5x5,3x3的maxpooling)的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合; 
2 . 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了; 

3 . 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了;

4 . 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。

对于右上图做以下说明:

使用5x5的卷积核仍然会带来巨大的计算量, 为此,文章借鉴NIN,采用1x1卷积核来进行降维


作者以Inception为基本构造块构造成了GoogLenet。GoogLenet有两个主要特点: 

(1)在低层时候仍然用传统的方式,高层用Inception块叠加。(论文中说"

For technical reasons (memory efficiency during training), it seemed beneficial to start using Inceptionmodules only at higher layers while keeping the lower layers in traditional convolutional fashion.This is not strictly necessary, simply reflecting some infrastructural inefficiencies in our currentimplementation.") ,大概的意思就是因为在训练阶段的内存效率问题

(2)网络最后采用了average pooling来代替全连接层,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune

(3)为了解决梯度弥散的问题,在4a和4d的后面添加辅助loss,该loss仅在训练的时候以一定的weight参与梯度传递,而在test的时候不用。

GoogleNet构架


每个Inception模块包含两层,即:2X9+4=22层


为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,作者paper中的表述如下:但是在测试的过程中我们发现,这两个额外的softmax会被去掉。



对于整个网络部分细节的解释如下:



二、Inception v2

在v1的基础上,进行了改进,一方面了加入了BN层,减少了Internal Covariate Shift(内部neuron的数据分布发生变化),使每一层的输出都规范化到一个N(0, 1)的高斯,另外一方面学习VGG用2个3x3的conv替代inception模块中的5x5,既降低了参数数量,也加速计算。


Bn的详细解释请参考我的另一篇博客:点击打开链接



三、Inception v3

下面的准则来源于大量的实验,因此包含一定的推测,但实际证明基本都是有效的。

1 . 避免表达瓶颈,特别是在网络靠前的地方。 信息流前向传播过程中显然不能经过高度压缩的层,即表达瓶颈。从input到output,feature map的宽和高基本都会逐渐变小,但是不能一下子就变得很小。比如你上来就来个kernel = 7, stride = 5 ,这样显然不合适。 

另外输出的维度channel,一般来说会逐渐增多(每层的num_output),否则网络会很难训练。(特征维度并不代表信息的多少,只是作为一种估计的手段)

2 . 高维特征更易处理。 高维特征更易区分,会加快训练。

3. 可以在低维嵌入上进行空间汇聚而无需担心丢失很多信息。 比如在进行3x3卷积之前,可以对输入先进行降维而不会产生严重的后果。假设信息可以被简单压缩,那么训练就会加快。

4 . 平衡网络的宽度与深度。

上述的这些并不能直接用来提高网络质量,而仅用来在大环境下作指导。


大尺寸的卷积核可以带来更大的感受野,但也意味着更多的参数,比如5x5卷积核参数是3x3卷积核的25/9=2.78倍。为此,作者提出可以用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,(保持感受野范围的同时又减少了参数量)如下图:


如上左图可见,为作者采用的非对称卷积形式的inception网络结构,参数会比原来的少,但是随之而来的问题是:

1 . 这种替代会造成表达能力的下降吗? 

后面有大量实验可以表明不会造成表达缺失;


2 . 3x3卷积之后还要再加激活吗? 

见右上图所示,作者也做了对比试验,表明添加非线性激活会提高性能。但是整体的差别不大。


于是,任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代。实际上,作者发现在网络的前期使用这种分解效果并不好,还有在中度大小的feature map上使用效果才会更好。(对于mxm大小的feature map,建议m在12到20之间)。

总结如下图:

(1) 图4是GoogLeNet V1中使用的Inception结构;

(2) 图5是用3x3卷积序列来代替大卷积核;

(3) 图6是用nx1卷积来代替大卷积核,这里设定n=7来应对17x17大小的feature map。该结构被正式用在GoogLeNet V2中。


四、Inception v4

v4研究了Inception模块结合Residual Connection能不能有改进?发现ResNet的结构可以极大地加速训练,同时性能也有提升,得到一个Inception-ResNet v2网络,同时还设计了一个更深更优化的Inception v4模型,能达到与Inception-ResNet v2相媲美的性能。


对于Inception系列的网络演变做如下总结:

1、Inception v1的网络,将1x1,3x3,5x5的conv和3x3的pooling,stack在一起,一方面增加了网络的width,另一方面增加了网络对尺度的适应性;
2、v2的网络在v1的基础上,进行了改进,一方面了加入了BN层,减少了Internal Covariate Shift(内部neuron的数据分布发生变化),使每一层的输出都规范化到一个N(0, 1)的高斯,另外一方面学习VGG用2个3x3的conv替代inception模块中的5x5,既降低了参数数量,也加速计算;
3、v3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv,使得网络深度进一步增加,增加了网络的非线性,还有值得注意的地方是网络输入从224x224变为了299x299,更加精细设计了35x35/17x17/8x8的模块;
4、v4研究了Inception模块结合Residual Connection能不能有改进?发现ResNet的结构可以极大地加速训练,同时性能也有提升,得到一个Inception-ResNet v2网络,同时还设计了一个更深更优化的Inception v4模型,能达到与Inception-ResNet v2相媲美的性能。

猜你喜欢

转载自blog.csdn.net/gbyy42299/article/details/80481066