Xception 并不是真正意义上的轻量化模型,是Google继Inception后提出的对Inception v3的另一种改进,主要是采用depthwise separable convolution来替代原来的Inception v3中的卷积操作,这种性能的提升是来自于更有效的使用模型参数而不是提高容量。一个卷积层尝试去学习特征在3维空间(高、宽、通道),包含了空间的相关性和跨通道的相关性。
Xception做了一个加强的假设,就是卷积的时候要将通道的卷积与空间的卷积进行分离,这样会不会更合理?
Xception结构演变:
既然是在Inception v3上进行改进的,那么Xception是如何一步一步的从Inception v3演变而来。
当时提出Inception的初衷可以认为是:特征的提取和传递可以通过1x1卷积,3x3卷积,5x5卷积,pooling等,到底哪种才是最好的特征提取方式呢?Inception结构将这个疑问留给网络自己训练,也就是将一个输入同时给这几种提取特征方式,然后做concat。 Inception v3和Inception v1(GoogLeNet)对比主要是将5x5卷积换成两个3x3卷积层的叠加。
Inception v1(GoogLeNet)结构:
原理:把同一个输入分为4队,各小队分头行动进行不同的处理,再把四种处理结果合并喂给下一层。目的是尽可能的解耦用不同的尺度(不同卷积)来获取不同层次、不同力度的信息。
为了防止越来越厚导致参数量、运算量爆炸,Inception进行了改进,在3*3和5*5卷积之前,先加了1*1卷积降维,控制厚度。
1*1卷积核降维具体如图(输出数据的通道数是由卷积核个数决定):
Inception v3结构如下图:
Inception v3把Inception v1(GoogLeNet)的5x5卷积换成两个3x3卷积层的叠加。(两个3*3卷积可以代替一个5*5卷积,可以获得相同的感受野,减少参数量,增加非线性和模型的表达能力)
Xception结构演变
第一层简化inception模块:
把Inception v3的1*1卷积层换成3*3卷积层。
第二层简化inception模块:
第一层全部用1*1卷积,第二层全用3*3卷积,而且只有两层,所有分支都进行了两层的处理。
第三层简化inception模块:
先进行一次1*1卷积,生成一个共享的特征图,三条分支都对共享的特征图进行3*3卷积。
第四层简化inception模块:
不同分支处理不同通道。被称为grouped convolutions.
第五层简化inception模块(Xception模块):
Xception的深度可分离卷积,先pointwise convolution,后depthwise convolution。(depthwise convolution和pointwise convolution顺序无影响)
普通的的深度可分离卷积:
同:
每个卷积核处理一个通道称为Depthwise Convolution,再用1*1卷积把跨通道信息补回来称为Pointwise Convolution。深度可分离卷积可以大大减少参数量、运算量,提升卷积的运算效率。
Xception模型:
Separable conv包含1*1卷积+深度可分离卷积+合并,加了残差连接可以大大加快收敛速度和最终性能。