文章目录
前言:
今天搞一下inception最后一个论文,Xception,该论文发表在CVPR2017。
看这篇论文之前建议看一下inception之前的几个版本,以及ResNet论文。
- ResNet 精读+复现
- inceptionV1 & GoogleNet 精读+复现
- inceptionV2 & BN 精读
- inceptionV3 精读
- InceptionV4 & Inception-ResNet 精读
论文下载地址:https://arxiv.org/pdf/1610.02357v3.pdf
论文题目:Xception: Deep Learning with Depthwise Separable Convolutions
Xception,这里的X是 Extreme的缩写,表示极致的 inception。
1.Abstract(摘要)
摘要部分第作者说inception结构是传统卷积和深度可分离卷积的中间形态。深度可分离卷积可以看作一个具有最大数量tower的Inception模块,随后提出Xception的思想,即通过使用深度可分离卷积来代替Inception模块产生的一个新网络架构 命名为Xception。
传统卷积:一个卷积核处理所有通道。
深度可分离卷积 :一个卷积核只处理一个通道。
tower:指Inception模块中各个path的数量
随后作者说了一下Xception的表现比inceptionV3 要好,且得到一个结论,两个模型的参数量相近,但Xception的效果更好,说明Xception对数据的学习率,或者说效率提高了。侧面反映Xception的模型结构更好,能在同样参数量上获得更好的效果。
2.Introduction(引言)
第一段惯例,介绍了一下当时的背景 CNN、LeNet到GoogleNet,inceptionV123还有Resnet等等,这些论文都在之前看过了,都在这个博客里,不过后面提到的两个论文 一个NiN一个知识蒸馏还没看,我倒是知道NiN提出了1 * 1卷积和全局平均池化代替全连接层的观点,知识蒸馏倒是听说过 不过还没看过,等弄完这篇 去看一下NiN和知识蒸馏吧。
第二段夸了一下自己家的inception模块,VGG是那种一条路走到黑的结构,就是一层卷积一层池化这样堆叠深度,而inception模块在宽度上进行了扩展,因为DL是玄学嘛,所以作者也是提出了自己的疑问,为啥inception能这么有效果。
2.1 初始假设
这一小节尝试解释前面留下的问题,为什么inception能有这么好的效果。
在通常情况下,一个卷积核学习映射两个方面,一个是通道维度,一个是空间维度(长度和宽度),这是3D的维度(长+宽+通道),而inception模块背后的思路是,分开这两个方面,达到一种‘解耦’的目的。
典型的inception模块是 1 * 1 卷积来处理维度方面,然后用分解卷积处理空间信息,就是5 * 5 分解成两个3 * 3 那种情况。这一段最后有个脚标1,这里是说,即使是在空间维度方面也是可以继续分解的,比如7 * 7 分解成 7 * 1 和 1 * 7 ,这个思想是在inceptionV3里面提出的不对称卷积,忘了可以去回顾一下。
后面一大段放了几张图,其实就是在说这个‘解耦’的思想,先放了一张inceptionV3的图,
可以看到这张图里基本都用了1 * 1 卷积进行降维,在这里可以说是在通道维度上进行处理。随后又处理了空间维度。
随后简化了一下 变成了下面这样:
再次简化:
可以看到作者将所有的1 * 1 卷积合并到了一起,并且画了一条隔阂一样的东西,这里的意思就是每个3 * 3 的卷积取这条隔阂里的三分之一处理,且互不重合,假设1 * 1 之后生成了30个通道,则后面的3 * 3 卷积各处理其中的10个通道。
这里又引出个问题,上面这个模型是 3 * 3 处理1 * 1中的三分之一,那到底每个处理其中的多少算是合适的?
2.2 进一步假设
这一节就是处理上个留下的问题,这里作者直接提出了 ‘Extreme’版本的处理方法,在之前是 假设了1 * 1 之后有30个通道,分给了三个卷积,每个卷积分到10个通道,而这里作者的 ‘Extreme’版本是 直接将这30个通道分给30个卷积去处理,即单独的对每一个空间信息做处理。(这算是全连接初始思想吗?哈哈,玩轮回啊?)
然后作者给出了这个思想的结构图:
将1 * 1 处理过后的数据,每一个维度都分给一个3 * 3卷积去处理。
所以整体下来 ‘Extreme’ 版本 就是 1 * 1处理通道维度之间的信息,3 * 3 卷积处理每一个通道维度内的空间维度信息。
这个思想结构被称为 ,深度可分离卷积 (depthwise separable convolution & separable convolution),这个分离卷积的‘分离’,就是分离在这里了嘛。
- depthwise convolution(空间维度的卷积,也就是长宽方向卷积)
- pointwise convolution (通道维度的卷积)
depthwise separable convolution 和 spatially separable convolution别搞混了!:
- 前者是刚刚提到的那种 每一个 3 * 3 处理一个空间维度信息,即depthwise convolution 加 pointwise convolution 。
- 后者是指inceptionV4里面的那个结构,就是7 * 7 分解成 7 * 1 和1 * 7 的那种结构。
本论文中的深度可分离卷积和原始的深度可分离卷积有一些不同。
- 第一点是本论文中是先进行通道维度的卷积(1 * 1 ),然后再进行空间维度的卷积(长宽方向的 3 * 3卷积),而原始的是先空间维度,再通道维度。
- 第二点是,本论文中xception使用了激活函数Relu,而原生的深度可分离卷积没有使用激活函数。
作者在随后紧接着说 顺序不同并不重要,因为本来就是交替的堆叠嘛,谁先谁后都一样的,当时第二点是否使用激活函数这点比较重要,作者也在后面会给出实验结论。
后面一段作者给出了在本论文中对传统卷积和深度可分离卷积的较为精准的定义。
- 常规卷积: 一个卷积核处理所有通道。称为single-segment case。
- 深度可分离卷积: 一个卷积核处理一个通道。称为one segment per channel。
inception游走在这俩的中间,即没有一个卷积核处理一个通道,也没有‘极端’的一个卷积核处理一个通道。
3.Prior work(前人工作介绍)
这一章节大概看一下就行,作者就是在介绍本篇论文所参考的文献以及前人的工作 包括借用的东西,他提到的大部分论文在之前都有看过了,这个博客里也有,像Lenet Alexnet VGG Zfnet Resnet inceptionV1234系列等。
后面一段作者说到深度可分离卷积最早在AlexNet里就有了,我看到这懵了一下,Alex里不是一条路走到黑的那种嘛,哪里用到深度可分离卷积了,然后我就又去看了一下Alex,又查了查资料,发现这里作者说的是类似于深度可分离卷积的思想,就是Alex里的GPU资源不足而使用数据分开并行训练的策略,有点分组卷积的意思。本段的后面又说inceptionV1和V2里也有深度可分离卷积,额行吧 你说哪里用到就哪里用到了,我估计是那个宽度分解的思想类似于深度可分离卷积的思想把。
后面提到一个论文 MobileNets,这个论文还没看过,好像是轻量化的一个网络模型,小本本安排上了。
4.The Xception architecture(Xception结构介绍)
这一章节就是正式提出了Xception模块,前面的介绍有提出了那个‘极致’的假设,在这里就直接用上了。就是 通道维度和空间维度的两方面处理彻底分开,达到解耦的效果。
Xception有36个卷积层用于特征提取,36个卷积层放到14个模块中,除了首尾模块,其余的都用线性残差连接,说白了就是带残差的可分离深度卷积的堆叠呗。本段最后一局继续对比一波其他模型,比VGG16和inception之前的版本好。
真是方面教材VGG了,我发现VGG之后的模型和论文都是对比VGG的,害。
5.Experimental evaluation(实验)
这一章都是在说实验细节,我一般实验都是大概i看过去的,也没什么可说的,我将所有要知道的点列出来了。
总结几个点:
-
FastEval14k 类似于是JFT的子数据集,在FastEval14k上跑模型,间接推断JFT(3.5E个数据)数据集上的情况。
-
数据集上每一张图片里有好几个分类,不像之前的imagenet里一张图片就是一个分类,所以最后不用softmax。
-
准确率性能评估比较特别,取top100,最后的结果是按照该分类在社交平台上的出现次数进行加权。
-
优化器 RMSprop,动量0.9,初始lr0.001,学习率衰减0.9(每300W样本)。
-
正则化策略,权重衰减(L2正则化, 1 e − 5 1e^{-5} 1e−5),dropout(50%),辅助分类器(本论文中没用这个策略)。
-
在Tensorflow上部署,用了60块 NVIDIA K80的显卡。
-
使用并行策略,同步数据并行(synchronous),每一个GPU都处理一个完整的batch。这篇博客我在说分组卷积的时候也提到了Alex,顺带再说一下,Alex的那个并行是将数据分成两块,每一块数据用一个GPU进行训练,而Xception的并行是数据并行,是不分数据的,因为这里作者用了60块GPU,所以将数据复制60份,每一份放到一块GPU中训练,最后所有结果求平均。
-
后面作者也说在训练JFT数据集的时候,因为JFT太大了,就使用了asynchronous的方法进行训练,这个方法就是在上面说的Alex的方法,每一个batch分成60份交给60块GPU去训练(数据量太大训练了三个月)。
-
实验和inceptionV3(无辅助分类)进行对比,imagenet数据集上 Xception比inceptionV3稍好一点,比VGG好,甚至比ResNet-152还好,在JFT上比inceptionV3好4.3%,在JFT上好这么多的可能原因是,inceptionV3有针对imagenet数据集做专门的调参,而且调了很长时间,所以在imagenet上效果比较好,而在JFT上就稍差点。
-
网络模型参数量对比 AlexNet–6000W ,GoogleNet–700W,VGG–1.38E,Xception–2000W,MobileNet–200W.
-
给Xecption加上残差结构,网络收敛的更快,准确度更高。
-
第六页 4.6第一段中的一个单词 benchmark 意思为 以对照实验方法测试。
-
在1 * 1 卷积之后和深度可分离卷积之前不用激活函数效果最好。
-
非线性激活函数只对未解耦时有用,对1 * 1 卷积之后的feature map做非线性激活会丢失特征信息,不利于后续空间维度上的可分离卷积。
总结
- 介绍了传统卷积和深度可分离卷积,并利用深度可分离卷积的思想造就了Xecption模块。
- Xecption模块就是有解耦的思想,让网络先处理通道维度,再处理空间维度(长宽)信息。
- 先处理那个维度的信息顺序上并不重要。
- 在1 * 1 之后,深度可分离卷积—空间维度处理之前不适用非线性激活函数效果最好。
作者也在最后的时候说了,本论文中的‘极致’inception 并不一定是最优化的,也就是他的1 * 1 后的feature map都找了一个3 * 3做对应,这样的1对1的关系并不一定是最优化的,相比较传统的 一个卷积核处理全部通道的情况,可能最优的解在这俩中间,可能是1比10或者怎么样的,就是在传统网络和深度可分离卷积的中间。
在最后可以看到这篇论文的参考文献,ResNet啊 Alexnet ,BN,NiN,知识蒸馏啊,Mobilenet等等,我发现这个论文的参考文献都是精品,后面一篇应该我会弄一下知识蒸馏或者NiN。