等了这么久终于要开始写Xception的读后感了,其实看过了Google Inception系列(V1~V4)的这几篇文章后再看这篇Xception是蛮好懂的。本文作者是Keras之父写的,所以出现Keras和Tensorflow还是很多的。
本文最重要的东西是深度可分离卷积(Depthwise Separable Convolutions),在它的基础上建立了Xception block。借鉴一下它的例子https://blog.csdn.net/Chaolei3/article/details/79374563来解释什么是深度可分离卷积:
假设有一个3×3大小的卷积层,其输入通道为16、输出通道为32。 那么一般的操作就是用32个3×3的卷积核来分别同输入数据卷积,这样每个卷积核需要3×3×16个参数,得到的输出是只有一个通道的数据。之所以会得到一通道的数据,是因为刚开始3×3×16的卷积核的每个通道会在输入数据的每个对应通道上做卷积,然后叠加每一个通道对应位置的值,使之变成了单通道,那么32个卷积核一共需要(3×3×16)×32 =4068个参数。
而深度可分离卷积的计算过程是怎么样的呢?下看下图一:
深度可分离卷积的过程是用16个3×3大小的卷积核(1通道)分别与输入的16通道的数据做卷积(这里使用了16个1通道的卷积核,输入数据的每个通道用1个3×3的卷积核卷积),得到了16个通道的特征图,我们说该步操作是depthwise(逐层)的,在叠加16个特征图之前,接着用32个1×1大小的卷积核(16通道)在这16个特征图进行卷积运算,将16个通道的信息进行融合(用1×1的卷积进行不同通道间的信息融合),我们说该步操作是pointwise(逐像素)的。这样我们可以算出整个过程使用了3×3×16+(1×1×16)×32 =656个参数。这就是所谓的深度可分离通道。
其实这篇文章核心的东西就这么一点,其他开都主要分析了由Inception结构引发的思考,然后一步步推理到深度可分离卷积。然后在介绍完这个深度可分离卷积之后,作者在这个基础上提出了Xception,结构如下图二:
Xception其实就是带残差连接的深度可分离卷积层的线性堆叠,可以从图中看到在跳跃连接这里用1x1卷积进行了降维,同时因为在Xception block里进行了池化,特征图缩小了,所以为了可以正常完成恒等映射,1x1卷积的步长变大了。
如上图三的Xception架构是基于Keras写的,可以对应着看,Tensorflow已经集成了深度可分离卷积,不知道其他框架有没有。