Xception

目录

  • 1. 提出背景
  • 2.论文核心
    • 2.1 Depthwise Separable Convolution 深度分离卷积

      • 2.1.1 常规卷积操作
      • 2.1.2 DepthWise Convolution
      • 2.1.3 PointWise Convolution
  • 3. 网络结构
  • 4. 核心代码

论文: Xception: Deep Learning with Depthwise Separable Convolutions

论文地址: https://arxiv.org/abs/1610.02357

代码地址:

  1. Keras: https://github.com/yanchummar/xception-keras

参考博客:

  1. Xception算法详解
  2. Depthwise卷积与Pointwise卷积

1. 提出背景

Xception 是 google 继 Inception 后提出的对 Inception v3 的另一种改进,主要采用 depthwise separable convolution来替代原来的 Inception v3 中的卷积操作.

1. Inception模块简介

Inception v3 的结构图如下Figure1:

当时提出Inception 的初衷可以认为是:

特征提取和传递可以通过 1x1,3x3,5x5 conv以及pooling,究竟哪种提取特征方式好呢,Inception 结构将这个疑问留给网络自己训练,也就是将一个输入同时输出给这几种特征提取方式,然后做Concatnate.

  • Inception v3 和 Inception v1 主要的区别是将 5x5的卷积核换成了2个 3x3 卷积核的叠加.

2. Inception模型简化

正如之前论文RexNeXt所说,Inception网络太依赖于人工设计了。于是结合ResNeXt的思想,从Inception V3联想到简化的Inception结构,就是Figure 2.

3. Inception模型拓展

我们可以做个等效的变换,事实上效果是一样的,有了Figure 3:

Figure 3 表示对于一个输入,先用一个统一的 1x1 的卷积核卷积,然后再连接3个 3x3卷积,这三个操作只将前面 1x1 卷积结果的一部分作为自己的输入(这里是1/3channel)的卷积.

既然如此,不如干脆点:

3x3的卷积核的个数和 1x1的输出channel 一样多,每个 3x3卷积都只和1个输入的channel做卷积.

2.论文核心

2.1 Depthwise Separable Convolution 深度分离卷积

DepthWise卷积PointWise卷积,合起来称作DepthWise Separable Convolution,该结构和常规卷积操作类似,可用来提取特征。但是相比较常规卷积操作,其参数量和运算成本较低,所以在一些轻量级网络中会碰到这种结构,比如说MobileNet.

2.1.1 常规卷积操作

对于一张 5x5 像素,三通道彩色输入图片(5x5x3),经过3x3卷积核的层,假设输出通道数量为4,则卷积核的shape为 3x3x3x4,最终输出4个Feature Map.

  • 如果为padding=same,则特征图尺寸为5x5
  • padding=valid,特征图尺寸3x3

2.1.2 DepthWise Convolution

不同于常规卷积操作:

DepthWise Convolution的一个卷积核只负责一个通道,一个通道只能被一个卷积核卷积.

同样对于这张5x5像素,三通道的彩色输入图片,DepthWise Convolution首先经过第一次卷积运算,不同于上面的常规卷积

DepthWise Convolution完全在二维平面进行,卷积核数量与上一层必须一致.(上一层通道与卷积核个数一致)

所以一个三通道的图像经过运算后生成了3个Feature Map.

但是这就存在一个缺点,首先:

  1. DepthWise Convolution 完成后 Feature Map 数量和输入层的通道数量相同,无法拓展Feature Map.
  2. 这种运算对输入层的每个通道独立进行卷积运算,没有有效利用在相同空间位置上的 feature 信息.

因此采用 PointWise Convolution 来将这些Feature Map重新组合生成新的 Feature Map.

2.1.3 PointWise Convolution

PointWise Convolution 的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1x1xM,其中M为上一层的通道数量:

这里PointWise Convolution 运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map,有多少个卷积核就有多少个输出Feature Maps.

有意思的是其实之前许多网络,例如Inception v3用PointWise Convolution来做维度缩减来降低参数,这里用来联系以及拓展Feature Maps。而DepthWise Convolution也并不是新出现的,它可以看做是分组卷积的特例,早在AlexNet就出现过.

3. 网络结构

Xception作为Inception v3的改进,主要是在Inception v3的基础上引入了depthwise separable convolution,在基本不增加网络复杂度的前提下提高了模型的效果.

疑问

  1. 有些人会好奇为什么引入depthwise separable convolution没有大大降低网络的复杂度?

原因在于作者加宽了网络,使得参数数量和Inception v3差不多,然后在这前提下比较性能.因此Xception目的不在于模型压缩,而是提高性能.

4. 核心代码

from keras.models import Model
from keras.layers import Dense, Input, BatchNormalization, Activation, add
from keras.layers import Conv2D, SeparableConv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.applications.imagenet_utils import _obtain_input_shape
from keras.utils import plot_model

def Xception():
    input_shape = _obtain_input_shape(None, default_size=299, min_size=71, data_format=‘channels_last‘, require_flatten=True)
    img_input = Input(shape=input_shape)

    # Block 1
    x = Conv2D(32, (3, 3), strides=(2, 2), use_bias=False)(img_input)
    x = BatchNormalization()(x)
    x = Activation(‘relu‘)(x)
    x = Conv2D(64, (3, 3), use_bias=False)(x)
    x = BatchNormalization()(x)
    x = Activation(‘relu‘)(x)

    residual = Conv2D(128, (1, 1), strides=(2, 2), padding=‘same‘, use_bias=False)(x)
    residual = BatchNormalization()(residual)

    # Block 2
    x = SeparableConv2D(128, (3, 3), padding=‘same‘, use_bias=False)(x)
    x = BatchNormalization()(x)
    x = Activation(‘relu‘)(x)
    x = SeparableConv2D(128, (3, 3), padding=‘same‘, use_bias=False)(x)
    x = BatchNormalization()(x)
    x = MaxPooling2D((3, 3), strides=(2, 2), padding=‘same‘)(x)

    x = add([x, residual])

    residual = Conv2D(256, (1, 1), strides=(2, 2), padding=‘same‘, use_bias=False)(x)
    residual = BatchNormalization()(residual)

    # Block 3
    x = Activation(‘relu‘)(x)
    x = SeparableConv2D(256, (3, 3), padding=‘same‘, use_bias=False)(x)
    x = BatchNormalization()(x)
    x = Activation(‘relu‘)(x)
    x = SeparableConv2D(256, (3, 3), padding=‘same‘, use_bias=False)(x)
    x = BatchNormalization()(x)
    x = MaxPooling2D((3, 3), strides=(2, 2), padding=‘same‘)(x)

    x = add([x, residual])

    residual = Conv2D(728, (1, 1), strides=(2, 2), padding=‘same‘, use_bias=False)(x)
    residual = BatchNormalization()(residual)

    # Block 4
    x = Activation(‘relu‘)(x)
    x = SeparableConv2D(728, (3, 3), padding=‘same‘, use_bias=False)(x)
    x = BatchNormalization()(x)
    x = Activation(‘relu‘)(x)
    x = SeparableConv2D(728, (3, 3), padding=‘same‘, use_bias=False)(x)
    x = BatchNormalization()(x)
    x = MaxPooling2D((3, 3), strides=(2, 2), padding=‘same‘)(x)

    x = add([x, residual])

    # Block 5-12
    for i in range(8):
        residual = x
        x = Activation(‘relu‘)(x)
        x = SeparableConv2D(728, (3, 3), padding=‘same‘, use_bias=False)(x)
        x = BatchNormalization()(x)
        x = Activation(‘relu‘)(x)
        x = SeparableConv2D(728, (3, 3), padding=‘same‘, use_bias=False)(x)
        x = BatchNormalization()(x)
        x = Activation(‘relu‘)(x)
        x = SeparableConv2D(728, (3, 3), padding=‘same‘, use_bias=False)(x)
        x = BatchNormalization()(x)

        x = add([x, residual])

    residual = Conv2D(1024, (1, 1), strides=(2, 2), padding=‘same‘, use_bias=False)(x)
    residual = BatchNormalization()(residual)

    # Block 13
    x = Activation(‘relu‘)(x)
    x = SeparableConv2D(728, (3, 3), padding=‘same‘, use_bias=False)(x)
    x = SeparableConv2D(1024, (3, 3), padding=‘same‘, use_bias=False)(x)
    x = BatchNormalization()(x)

    # Block 13 Pool
    x = MaxPooling2D((3, 3), strides=(2, 2), padding=‘same‘)(x)
    x = add([x, residual])

    # Block 14
    x = SeparableConv2D(1536, (3, 3), padding=‘same‘, use_bias=False)(x)
    x = BatchNormalization()(x)
    x = Activation(‘relu‘)(x)

    # Block 14 part2
    x = SeparableConv2D(2048, (3, 3), padding=‘same‘, use_bias=False)(x)
    x = BatchNormalization()(x)
    x = Activation(‘relu‘)(x)

    # 全链接层
    x = GlobalAveragePooling2D()(x)
    x = Dense(1000, activation=‘softmax‘)(x)

    return Model(inputs=img_input, outputs=x, name=‘xception‘)

if __name__ == ‘__main__‘:
    model = Xception()
    model.summary()
    plot_model(model, show_shapes=True)

原文地址:https://www.cnblogs.com/FLYMANJB/p/10126854.html

时间: 2024-07-31 22:51:44

Xception的相关文章

深度学习方法(十一):卷积神经网络结构变化——Google Inception V1-V4,Xception(depthwise convolution)

技术交流QQ群:433250724,欢迎对算法.机器学习技术感兴趣的同学加入. 上一篇讲了深度学习方法(十):卷积神经网络结构变化--Maxout Networks,Network In Network,Global Average Pooling,本篇讲一讲Google的Inception系列net,以及还是Google的Xception.(扯一下,Google的Researcher们还是给了很多很棒的idea的,希望读者朋友和我自己在了解paper之余,可以提出自己的想法,并实现.) 如果想

1、VGG16 2、VGG19 3、ResNet50 4、Inception V3 5、Xception介绍——迁移学习

ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 本文翻译自ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks,原作者保留版权 卷积神经网络在视觉识别任务上的表现令人称奇.好的CNN网络是带有上百万参数和许多隐含层的"庞然怪物".事实上,一个不好的经验规则是:网络越深,效果越好.AlexNet,VGG,Inc

从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2

from:https://blog.csdn.net/qq_14845119/article/details/73648100 Inception v1的网络,主要提出了Inceptionmodule结构(1*1,3*3,5*5的conv和3*3的pooling组合在一起),最大的亮点就是从NIN(Network in Network)中引入了1*1 conv,结构如下图所示,代表作GoogleNet 假设previous layer的大小为28*28*192,则, a的weights大小,1*

Xception网络结构理解

Xception网络是由inception结构加上depthwise separable convlution,再加上残差网络结构改进而来/ 常规卷积是直接通过一个卷积核把空间信息和通道信息直接提取出来,结合了spatial dimensions和channels dimensions:xception这种是分开做的. 它最初的想法是从Incetpion来的,总体思想是把corss-channel correlations和spatial correlations充分解耦合: 将Inceptio

轻量化卷积神经网络模型总结by wilson(shffleNet,moblieNet,squeezeNet+Xception)

一.简介 主要参考博客:纵览轻量化卷积神经网络 https://zhuanlan.zhihu.com/p/32746221 1, SqueezeNet: SqueezeNet对比AlexNet能够减少50倍的网络参数,但是却拥有相近的性能.SqueezeNet主要强调用1x1的卷积核进行feature map个数的压缩,从而达到大量减少网络参数的目的.在构造网络的时候,采用VGG的堆叠思想. 2, moblieNet: MobileNet采用depth-wise convolution的卷积方式

轻量级网络 Inception, Pointwise Conv, Group Conv, Depthwise Conv, Bottleneck, Xception, MobileNet, ShuffeNet, ResNeXt, SqueezeNet, EfficientNet, MixConv

1. Abstract 本文旨在简单介绍下各种轻量级网络,纳尼?!好吧,不限于轻量级 2. Xception 2.1 Extreme Inception 2.2 Xception 3. MobileNet 3.1 MobileNet V1 3.2 MobileNet V2 3.3 MobileNet V3 4. ShuffeNet 4.1 ShuffeNet V1 Shuffe units Network Architecture Experiments 4.2 ShuffeNet V2 5. 

深度学习方法(十):卷积神经网络结构变化——Maxout Networks,Network In Network,Global Average Pooling

技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 最近接下来几篇博文会回到神经网络结构的讨论上来,前面我在"深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning"一文中介绍了经典的CNN网络结构模型,这些可以说已经是家喻户晓的网络结构,在那一文结尾,我提到"是时候动一动卷积计算的形式了",原因是很多工作证明了,在基本的CNN卷积计算模式之外,很多简

Linux编译Hadoop成64位常见错误

[ERROR] Failed to execute goal org.apache.hadoop:hadoop-maven-plugins:2.2.0:protoc (compile-protoc) on project hadoop-common: org.apache.maven.plugin.MojoExecutionException: protoc version is 'libprotoc 2.4.1', expected version is '2.5.0' -> [Help 1]

从零教你在Linux环境下(ubuntu)如何编译hadoop2.4

问题导读: 1.如果获取hadoop src  maven包?2.编译hadoop需要装哪些软件?3.如何编译hadoop2.4?扩展:编译hadoop为何安装这些软件? 本文链接 http://www.aboutyun.com/thread-8130-1-1.html 一.首先下载hadoop源码包下载的方式还是比较多的1.svn的方式svn下载首先需要安装SVN,如果想尝试使用svn,可以参考源码管理.获取网络源码工具:TortoiseSVN使用手册,hadoop的svn下载地址点此2.压缩