一 为什么读这篇
Xception这个网络结构很早就知道了,也使用过,最早看到是在keras之父的《Deep Learning with Python》这本书里,不过只是提了一下,说的不多。当时还有个感慨,怪不得用keras实现的Xception做的那么好,原来keras和Xception都是François Chollet大神一个人搞的。这次读下原文,看下Xception的来龙去脉。
二 截止阅读时这篇论文的引用次数
2019.2.26 661次。
三 相关背景介绍
本篇在16年10月挂到arXiv上,中了2017年CVPR。作者是鼎鼎大名的keras之父,François Chollet,本文由他一人独立完成,都没挂其他人。。另外,Xception提出的结构和几乎同时期出的mobilenet很像,很难说谁借鉴了谁。
keras官方博客:https://blog.keras.io/index.html
四 关键词
Xception
Depthwise Separable Convolutions
五 论文的主要贡献
1 提出Xception的网络结构
2 提出深度可分卷积
六 详细解读
0 摘要
本文将Inception模块视为常规卷积和深度可分卷积之间的中间步骤(深度卷积后跟着逐点卷积)。在这种情况下,深度可分卷积可以理解为拥有最大数量towers的Inception模块。受Inception启发,并基于这个观察提出了全新的Xception架构(Inception模块可用深度可分卷积替代)。效果比Inception V3要好,同时因为它俩参数一样,所以并不是通过增加模型容量,而是通过更有效的参数利用来提升效果的。
1 介绍
xception-fig1.png虽然Inception模块在概念上类似于卷积(它们是卷积特征提取器),但在实际中似乎能够用较少的参数来学习更为丰富的表示。 它们是如何工作的?这与常规卷积有何不同? 在Inception之后又有哪些设计策略?
1.1 Inception的假设
卷积层学习的filters是三维空间的,其中2个为空间维度(宽和高),1个为通道维度,所以单个卷积核的任务是同时映射空间上的相关性和通道间的相关性。Inception背后的想法是通过将其明确地分解为一系列独立地查看通道间相关性和空间上相关性的操作,使这个过程更容易有效。具体来讲,典型的Inception模块首先通过一组1x1卷积查看通道间相关性,将输入数据映射到比原始输入空间小的3到4个独立子空间,然后通过常规的3x3或5x5卷积,映射这些较小三维空间的所有相关性。如图1所示。
这里考虑Inception模块的一个简化版本,仅使用相同大小的卷积(如3x3),不包括平均池化层(图2)。
xception-fig2.png这个Inception模块可以重新表示为一个大的1x1卷积,其后跟着空间卷积,用来在输出通道的非重叠段上运行(图3)。
xception-fig3.png通过这种观察自然会引出一个问题:分区中的段的个数(及其大小)的有什么影响?一个比Inception假设更强的假设是否合理,即假设可以完全分开映射通道间相关性和空间相关性?
1.2 卷积与可分卷积的连续序列
基于这种强假设的"extreme"版本的Inception模块,首先使用1x1卷积来映射通道间相关性,然后分别映射每个输出通道的空间相关性(图4)。
xception-fig4.png本文发现这种极限形式的Inception模块几乎与深度可分卷积相同,后者早在2014年就被用于网络设计,并随着包含在16年出的TensorFLow中变得越来越流行。
极限版本的Inception模块和深度可分卷积有两点轻微的不同:
1 执行顺序:深度可分卷积先执行空间卷积,再执行1x1卷积,而Inception先执行1x1卷积
2 第一次执行后是否存在非线性变换:在Inception中,两个操作后都跟着ReLU非线性变换,而深度可分卷积的实现通常没有非线性变换
本文也注意到在常规Inception模块和深度可分卷积之间的其他对Inception模块中间形式的定义也是可以的:事实上,在常规卷积和深度可分卷积之间存在一系列的离散状态,通过用于执行空间卷积的独立空间通道段的数量来参数化。该系列的一个极限是常规卷积(前面是1x1卷积),对应于单段情况,深度可分卷积对应于另一个极限,即每个通道有一个段,Inception模块介于两者之间,将数百个通道分为3到4个段。这些中间状态的属性似乎还没有被探索过(本文的机会来了!)
2 先前工作
本文工作依赖于以下几个领域的前驱工作:
1 卷积网络,特别是VGG-16
2 Inception系列,第一个证明了将卷积分解在多个分支通道上,然后在空间上运行的优点
3 深度可分卷积,本文提出的架构完全基于此。它其实早在2012年或者更早之前就提出来了,后续各种网络也有用到,包括MobileNets。
4 残差连接
3 Xception架构
本文提出的架构完全基于深度可分卷积层。事实上,做了如下假设:即CNN特征图中的通道间相关性和空间相关性可以完全解耦。因为该假设是Inception架构假设的更强版本,因此将本文架构称为Xception,意为极限Inception(Extreme Inception)
xception-fig5.pngXception有36个卷积层作为网络的基础特征提取,这36个卷积层结构化为14个模块(4+8+2),除了第一个和最后一个模块,所有的模块都有线性残差连接。
简单来说,Xception架构就是带残差连接的深度可分卷积层的线性堆叠。用Keras只要30-40行即可实现。
4 实验评估
因为Xception和Inception V3参数数量类似,因此拿它当比较对象,并在ImageNet和有17000个类的Google自己内部数据集JFT上做了实验。
4.1 JFT数据集
JFT是Google内部的数据集,首次对外出现是在Hinton的知识蒸馏网络中。由3亿5千万张图,1万7千类组成。为了评估在JFT上训练的模型,用辅助数据集FastEval14k。
4.2 优化配置
ImageNet
SGD,0.9,0.045,lr每2个epoch以0.94衰减
JFT
RMSprop,0.9,0.001,lr每300万个采样以0.9衰减
Xception和Inception V3用的一样的配置,不过V3是做了超参调优的,而Xception并没有
xception-fig6.png4.3 正则化配置
Weight decay
V3的系数用4e-5,而Xception发现这样是欠优化的,因此用1e-5。
Dropout
对于ImageNet,两者都在输出层前接一个0.5的Dropout,对于JFT,没有过拟合问题所以不要Dropout了。
Auxiliary loss tower
Inception V3有用到,出于简化的目的,本文不用任何辅助tower。
4.4 训练架构
所有网络用TF在60块K80上实现。ImageNet的实验用数据并行的同步梯度下降,花3天训练完。JFT的实验用异步梯度下降来加速训练,跑了一个月还没跑收敛,跑收敛估计得3个月。。。
4.5 和Inception V3的比较
4.5.1 分类性能
xception-table1.png xception-table2.png xception-fig7.png xception-fig8.pngJFT的提升比ImageNet的提升更明显,说明Xception比Inception V3的适应能力更强。
4.5.2 大小和速度
xception-table3.pngXception会慢点,期望未来会有深度卷积的工程优化。
4.6 残差连接的效果
xception-fig9.png4.7 卷积后中间激活的效果
xception-fig10.png没有非线性激活反而有更快的闭合和更好的性能,这与Inception V3的结论相反。可能空间卷积中间特征空间的深度对于非线性的使用是至关重要的:对于深度特征空间非线性是有帮助的,但是对于浅层(如深度可分卷积的1通道深度特征空间)则变得有害,有可能是因为信息损失。
七 读后感
论文还是得一批一批按系列读,Inceptio的模块有效性的解释,通过后来的文章从不同的角度去解释,如果只看别人的总结,就会导致只记住了一个结论,而不知道是如何来的,还有个缺点是缺少对先前工作的反思总结。作者的写作方式不按套路出牌,核心的第三节居然只有短短的几段,篇幅连半页都没占到。另外非常喜欢拽一些双关语,导致有些词根本不知道在说什么。。看完后,感觉Xception的结构和ResNeXt很像。bwt,还是Google狠,有JFT那么大一个数据集自己用,没有开源出来。
素质四连
要解决什么问题
更进一步探索Inception结构为什么有效
用了什么方法解决
指出Inception只是常规卷积和深度可分卷积的一种中间状态,从而提出极限Inception-Xception,并综合了几个前辈的优势,设计了新的网络架构
效果如何
和Inception V3相比,在ImageNet上有一点提升,在JFT上有很大提升(无怪乎doodle用Xception的效果要好些)
还存在什么问题
深度可分卷积的底层实现还不是最优的
八 补充
CVPR 2017精彩论文解读:对Xception(一种深度可分离卷积)模型的介绍
作者本人在twitte如上给出的架构和代码图
xception-code.jpg
网友评论