深度学习之经典神经网络框架详解(八):GoogLeNet:Inception-v4

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Superstar02/article/details/102491251

Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

简述:

残差神经网络(ResNet)框架在2015年ILSVRC挑战赛中达到了当时最好的性能,作者考虑将Inception与ResNet相结合是否有益处,并通过实验证明了残差神经网络的加入能够显著加速Inception的训练且表现更好。基于此,作者提出了 有or无残差的网络结构,并证明保证very wide residual Inception networks训练的稳定激活比例。使用three residual and one Inception-v4在top-5的错误率为3.08%。(On the ImageNet classification challenge.)

问题or相关工作:

由于ResNet对于训练深度架构很重要,作者将残差连接与最新的Inception相结合,在保持计算效率的同时也获得了残差块连接的优点。此外,作者提出Inception-v4框架。对比了Inception-v3、v4、Inception-ResNet versions.实验证明Inception-v4 and Inception- ResNet-v2性能都超过了ImageNet验证数据集的最先进的单帧性能,并得到了3.1%的top-5的错误率。
作者通过实验表明,Residual learning并非深度网络走向更深的必需条件,其只是可以使得深度网络的训练速度加快而已。为了表明这一点,作和设计出更为复杂、精巧的Inception v4网络,在不使用residual learning的情况下也达到了与Inception-Resnet v2近似的精度。

模型:

Pure Inception blocks:

提出的v4网络执行迁移到了tensorflow上面来执行,因此可不必再像之前在DistBelief上那样受限于他们所用系统的内存、计算等局限而只在几种可行的范围里选择inception 通用模块设计。在新的实验中,对每个网格大小的初始块做出统一的选择,随需地设计data parallel与model parallel的网络。


注:nception-v3的大部分结构仍是copy之前的v2、v1的,这主要是为分片训练考虑。2015年还没tensorflow,如果整个结构在一台机器上训练就会占用较多的内存,所以需要把整个结构copy多台机器上跑,每台机器跑其中的一部分结构。分片训练时需要考虑各个机器上计算量的平衡来缩短总的训练时间,所以结构设计时会有很多限制。


Inception V4的总体结构:
在这里插入图片描述
上图左边为Inception-v4的整体结构,网络可以很清晰的被划分为一个个block,且Inception的block都是重复使用(如4 × Inception-A),因为它的input和output尺寸是一样的。Reduction主要是用来降低feature map的尺寸。另外每个block中没有标记V的都表示same padding。
上图右边为整体结构的Stem部分,用于对进图Inception模块之前的数据预处理,可以看出,Stem部分就是多次卷积+2次pooling,pooling采用了Inception-v3论文里提到的卷积+pooling并行的结构,来防止bottleneck问题。
接下来的Inception-A、Inception-B、Inception-C具体操作如下图所示:
在这里插入图片描述
Reduction主要是用来降低feature map的尺寸,同样使用了并行的结构来防止bottleneck问题。
在这里插入图片描述

Residual Inception Blocks:

作者详细介绍了其中的两个。第一个“Inception-ResNet-v1”大致相当于“Inception -v3”的计算成本,而“Inception-ResNet-v2”则相当于新引入的“Inception- v4”网络的原始成本。(在实践中, v4的步长明显较慢)
residual and non-residual Inception之间差异:在Inception-ResNet,只在传统层上使用批处理规范化,而相加那层不使用。通过省略这些层上的批处理规范化,我们能够大幅度增加初始块的总数。
结构图如下:
在这里插入图片描述
上图左边为Inception-ResNet-v1和Inception-ResNet-v2两种Inception-Resnet结构。他们总体结构一致,里面的block不同(具体看图片下面的注释)。右边为Inception-ResNet-v1的Stem块。
Inception-ResNet-v1按顺序的每一块为(14在上图右):
在这里插入图片描述
在这里插入图片描述
Inception-ResNet-v2按顺序的每一块为(3在最前面):
在这里插入图片描述
在这里插入图片描述

缩小残差:

作者发现如果filter的数量超过1000,残差网络会变得不稳定,网络会在训练的早期就‘死掉’,即意味着在几万次迭代之后,avg_pool之前的最后几层网络参数全是0。而这个问题无法通过降低学习率或者添加额外的BN层来处理。作者发现在将残差模块添加到activation激活层之前,对其进行放缩能够稳定训练,通常来说将残差放缩因子定在0.1-0.3,有助于训练的稳定。
在这里插入图片描述

实验结果:

在这里插入图片描述
在这里插入图片描述
从上图实验结果可以看出来,作者提出的几种模型较之前的模型的准确率都高,并且Inception-v4 + 3× Inception-ResNet-v2 Models取得了3.08%的top-5的错误率,且没有过拟合,达到了很好的性能。

总结:

本文研究了如何引入残差模块来提高Inception体系结构的训练速度,
且随着模型参数的增加,取得了空前未有的良好性能。

对比作者提出的Inception-ResNet-v1与Inception-ResNet-v2,Inception-v4三种结构,最明显的差别是Stem部分不同,特别是与Inception-ResNet-v2相比,其它部分几乎就只是卷积层数的变化,而在Stem部分,其它两个使用相同的结构, v1这部分输出为3535256,其它两个输出为3535384,显然这里明显让v1吃亏了,其性能差的原因可能在于此。之后Inception-ResNet-v2与Inception-v4相比,架构的总体结构可以看出是很相似的,最大的区别在于数据是否是直接传到下一层的。

猜你喜欢

转载自blog.csdn.net/Superstar02/article/details/102491251
今日推荐