当前位置:   article > 正文

DeepLabV3+(tensorflow)工程应用系列(四)—— Xception网络结构解析_xception65网络

xception65网络

一、论文介绍

论文下载地址Xception: Deep Learning with Depthwise Separable Convolutions(2017).

论文主要内容:该论文是对【Inception-V3】网络的改进,添加了深度可分离卷积(Depthwise Separable Convolutions)以及残差连接模块(residual connection),在此基础上构成了【Xception】网络结构。整体的网络结构如下图所示(注意:下图是论文中的截图,展示的是Xception-41 结构,而DeepLab-V3+应用的是Xception-65,结构不同):

在这里插入图片描述

二、Inception模块回顾

在 Inception 模块中,通过 1 × 1卷积,3 × 3卷积,5 × 5卷积,pooling 等卷积单元组合在一起进行特征提取。Inception 结构将特征的选择留给网络自己训练,也就是将一个输入同时输给几种提取特征方式,然后做 concat 。Inception-v3的基本模块如下图所示:

在这里插入图片描述
通过去除【Avg Pool】,简化的【Inception】模块如下图所示:

在这里插入图片描述
再将【Figure2】进一步延伸,得到【Figure3】。对于一个输入,先用统一的【1x1】卷积核卷积,然后连接3个【3x3】的卷积,这3个卷积操作只将前面【1x1】卷积结果中的一部分作为自己的输入(这里是将1/3 channel 作为每个【3x3】卷积的输入),具体见下图所示:

在这里插入图片描述
上述【Inception】模块的变化,我们会有这样的疑问:经过【1x1】卷积后得到特征图的通道数量或者尺寸具有怎样的影响?我们进行这样强烈的假设,或者说是【Inception】模块的假设,即交叉通道的相关性和空间的相关性(cross-channel correlations and spatial correlations)是否可以分开考虑?

基于上述强烈的独立性假设,一种极端的【Inception】模块,得到【Figure4】的变化形式,也就是【3x3】卷积的个数和【1x1】卷积的输出 channel 个数一样,每个【3x3】卷积都是和输入的一个 channel 做卷积。这种形式的模块比较接近深度可分离卷积了,具体如下图所示:

在这里插入图片描述

三、深度可分离卷积解析

  卷积神经网络在图像处理中的地位已然毋庸置疑。大量卷积运算的叠加具备强大的特征提取能力、相比全连接又消耗更少的参数,应用在图像这样的二维结构数据中有着先天优势。然而受限于目前移动端设备硬件条件,显著降低神经网络的运算量依旧是网络结构优化的目标之一。本文所述的【Separable Convolution】就是降低卷积运算参数量的一种典型方法。

常规卷积运算

假设输入层为一个大小为64×64像素、三通道彩色图片。经过一个包含4个Filter的卷积层,最终输出4个Feature Map,且尺寸与输入层相同。整个过程可以用下图来概括:
在这里插入图片描述
此时,卷积层共4个Filter,每个Filter包含了3个Kernel,每个Kernel的大小为3×3。因此卷积层的参数数量可以用如下公式来计算:

N_std = 4 × 3 × 3 × 3 = 108
  • 1
深度可分离卷积

深度可分离卷积【Separable Convolution】在 Google 的Xception[1]以及MobileNet[2]论文中均有描述。它的核心思想是将一个完整的卷积运算分解为两步进行,分别为【Depthwise Convolution】与【Pointwise Convolution】。

  1. Depthwise Convolution
    同样是上述例子,一个大小为64×64像素、三通道彩色图片首先经过第一次卷积运算,不同之处在于此次的卷积完全是在二维平面内进行,且Filter的数量与上一层的Depth相同。所以一个三通道的图像经过运算后生成了3个Feature map,如下图所示:
    在这里插入图片描述
    其中一个Filter只包含一个大小为3×3的Kernel,卷积部分的参数个数计算如下:

    N_depthwise = 3 × 3 × 3 = 27
    
    • 1

    Depthwise Convolution】完成后的 feature map 数量与输入层的 depth 相同,但是这种运算对输入层的每个 channel 独立进行卷积运算后就束了,没有有效的利用不同 map 在相同空间位置上的信息。因此需要增加另外一步操作来将这些 map 进行组合生成新的 Feature map,即接下来的【Pointwise Convolution】。

  2. Pointwise Convolution
    Pointwise Convolution】的运算与常规卷积运算非常相似,不同之处在于卷积核的尺寸为【1×1×M】,M为上一层的【depth】。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个Filter就有几个Feature map。如下图所示:
    在这里插入图片描述
    由于采用的是1×1卷积的方式,此步中卷积涉及到的参数个数可以计算为:

    N_pointwise = 1 × 1 × 3 × 4 = 12
    
    • 1

    经过【Pointwise Convolution】之后,同样输出了4张 Feature map,与常规卷积的输出维度相同。

  3. 参数对比
    回顾一下,常规卷积的参数个数为:

    N_std = 4 × 3 × 3 × 3 = 108
    
    • 1

    Separable Convolution】的参数由两部分相加得到:

    N_depthwise = 3 × 3 × 3 = 27
    N_pointwise = 1 × 1 × 3 × 4 = 12
    N_separable = N_depthwise + N_pointwise = 39
    
    • 1
    • 2
    • 3

    相同的输入,同样是得到4张Feature map,【Separable Convolution】的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Separable Convolution的神经网络层数可以做的更深。

四、DeepLab-V3+中的Xception-65

主要分为3部分:输入数据依次通过【Entry flow】=> 【Middle flow】=> 【Exit flow】,得到最终的结果。

  1. Entry flow
    【Entry flow】整体结构如下图所示,网络的输入为:【?x 513 x 513 x 3】,包含两层普通卷积(3x3x3x32,3x3x32x64)+ block1 + block2 + block3,下图是tensorboard展示的网络结构图:
    在这里插入图片描述

    每一个【block】的结构如下图所示,如图红色圆圈所示,每个【block】总共有 3 个深度可分离卷积层,并且添加残差连接通道,具体如下图所示:

    在这里插入图片描述
    每个深度可分离卷积层的结构为【depthwise + BN】+ 【pointwise + BN】 。先用【3 x 3】卷积进行通道上的分离计算,然后使用【1 x 1】卷积将特征进行合并,并且都有添加【BN】层,具体如下图所示,可以对比上面深度可分离卷积的原理进行理解:
    请添加图片描述请添加图片描述

  2. Middle flow
    该模块总共有16个单元,每一个单元的结构与【Enty flow】的一个【block】结构一样,差别是卷积核的数量不一样
    在这里插入图片描述

  3. Exit flow
    该模块有2个【block】,【block1】与上面的结构一样,【block2】唯一不同的就是没有残差连接,见下图所示:
    在这里插入图片描述

五、参考链接

  1. https://yinguobing.com/separable-convolution/#fn2(写的非常好)
  2. https://blog.csdn.net/u014380165/article/details/75142710
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号