精简CNN模型系列之七:Xception
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精简CNN模型系列之七:Xception相关的知识,希望对你有一定的参考价值。
参考技术A Xception是Google出品,属于2017年左右的东东。它在Google家的MobileNet v1之后,MobileNet v2之前。它的主旨与MobileNet系列很像即推动Depthwise Conv + Pointwise Conv的使用。只是它直接以Inception v3为模子,将里面的基本inception module替换为使用Depthwise Conv + Pointwise Conv,又外加了residual connects,
最终模型在ImageNet等数据集上都取得了相比Inception v3与Resnet-152更好的结果。当然其模型大小与计算效率相对Inception v3也取得了较大提高。
下图1为一个典型的Inception module,它的实现的基本assumption就是feature在经conv处理时可分别学习feature channels间的关联关系与feature单个channel内部空间上的关联关系,为此inception module中使用了大量的1x1 conv来重视学习
channels之间的关联,然后再分别使用3x3/5x5(两个3x3)等去学习其不同维度上的单个channel内的空间上的关联;若我们基于以上inception中用到的关联关系分离假设而只使用3x3 convs来表示单个channel内的空间关联关系,那么就可以得到出下图2表示的
简化后了的inception module。
而本质上上图2中表示的简化版Inception模块又可被表示为下图3中的形式。可以看出实质上它等价于先使用一个1x1 conv来学习input feature maps之上channels间特征的关联关系,然后再将1x1 conv输出的feature maps进行分割,分别交由下面的若干个3x3
conv来处理其内的空间上元素的关联关系。
更进一步,何不做事做绝将每个channel上的空间关联分别使用一个相应的conv 3x3来单独处理呢。如此就得到了下图4中所示的Separable conv。
下图中为Xception结构的表示。它就是由Inception v3直接演变而来。其中引入了Residual learning的结构(已经有多项工作,同时在本文中作者也有相关实验表明Residual learning在CNN模型中的使用可带来收敛速度的加快。)。
同一向复杂的Inception系列模型一样,它也引入了Entry/Middle/Exit三个flow,每个flow内部使用不同的重复模块,当然最最核心的属于中间不断分析、过滤特征的Middel flow。
Entry flow主要是用来不断下采样,减小空间维度;中间则是不断学习关联关系,优化特征;最终则是汇总、整理特征,用于交由FC来进行表达。
下表为Xception与其它模型在Imagenet上分类精度的结果比较。
然后下表则为Xception与Inception v3在模型参数大小与计算速度上的比较。
在TF的官方实现中,他们对Xception的模型结构做了些改变,主要如下两块。一是使用stride为2的conv来代替使用Maxpooling进行feature降维;二则是在depthwise conv之后同样使用ReLu与BN。
以下为Xception的模型构建入口函数。
以下函数则是构建具体的blocks。。感觉Google有过度设计的嫌疑,非得将一个简单模型构得那么多层次,即使是slim这样已经高级了些的model让人看起来仍然要追着看很久。。推荐大家使用Pytorch啊。。:)。
就到这了,再向下不追了,还想进一步探究的朋友可以直接去翻参考文献里标明的code file。
以上是关于精简CNN模型系列之七:Xception的主要内容,如果未能解决你的问题,请参考以下文章
彻头彻尾理解JVM系列之七:对象在分代模型中的流转过程是怎样的?