Inception-v4与Inception-ResNet结构详解(原创)

Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning,原文链接:https://arxiv.org/pdf/1602.07261.pdf

微软亚洲研究院的何恺明在2015年提出了震惊业界的ResNet结构,这种结构和以往的Inception结构走了两条不同的道路:前者主要关注加大网络深度后的收敛问题,而Inception更关注特征维度上的利用。如果把这两种方法结合起来会有什么效果呢?Szegedy在2016年就试验了一把,把这两种 最顶尖的结构混合到一起提出了Inception-ResNet,它的收敛速度更快但在错误率上和同层次的Inception相同;Szegedy还对自己以前提出的Inception-v3进行了一番改良,提出了Inception-v4。Inception-v4与Inception-ResNet集成的结构在ImageNet竞赛上达到了3.08%的top5错误率,也算当时的state-of-art performance了。下面分别来看看着两种结构是怎么优化的:

一、Inception-v4

Szegedy在2015年提出了Inception-v3的结构,Inception-v3的大部分结构仍是copy之前的v2、v1的,这主要是为分片训练考虑。2015年还没有tensorflow,如果整个结构在一台机器上训练就会占用较多的内存,所以需要把整个结构copy多台机器上跑,每台机器跑其中的一部分结构。分片训练时需要考虑各个机器上计算量的平衡来缩短总的训练时间,所以结构设计时会有很多限制。但到了2016年,Tensorflow开始广泛使用,Tensorflow对内存的占用做了很多优化,这时就不需要将整个结构分片来训练了,在这样的前提下Szegedy就开始了大刀阔斧的优化,有了Inception-v4。

图1左侧是Inception-v4的整体结构,图1右侧是其中的stem部分,用于对进入Inception模块前的数据进行预处理。stem部分其实就是多次卷积+2次pooling,pooling采用了Inception-v3论文里提到的卷积+pooling并行的结构,来防止bottleneck问题。stem后用了3种共14个Inception模块(图2),三种Inception模块具体是怎么取舍参数的论文没有过多解释,估计还是靠经验判断吧。三种Inception模块间的Reduction模块(图3)起到pooling作用,同样使用了并行的结构来防止bottleneck问题。

图1: Inception-v4结构
图2:从左到右分别为Inception-v4中的 Inception A、 Inception B、 Inception C模块 
图3: Inception-v4中的 Reduction模块

二、Inception-ResNet

Szegedy把Inception和ResNet混合,设计了多种Inception-ResNet结构,在论文中Szegedy重点描述了Inception-ResNet-v1(在Inception-v3上加入ResNet)和Inception-ResNet-v2(在Inception-v4上加入ResNet),具体结构见图4和图5

图4: Inception-ResNet-v1 整体结构
图5: Inception-ResNet-v1 的三种 Inception 结构

性能测试结果我就不贴了,详细数据请看原文链接。

推荐阅读更多精彩内容