2017_Xception

图:

网络描述:

Xception是谷歌公司继Inception后,提出的InceptionV3的一种改进模型,其改进的主要内容为采用depthwise separable convolution来替换原来Inception v3中的多尺寸卷积核特征响应操作。
首先要讲一下什么是depthwise separable convolution:对于一个卷积点而言,假设有一个3×3大小的卷积层,其输入通道为16、输出通道为32。具体为,32个3×3大小的卷积核会遍历16个通道中的每个数据,最后可得到所需的32个输出通道,所需参数为16×32×3×3=4608个。应用深度可分离卷积,用16个3×3大小的卷积核分别遍历16通道的数据,得到了16个特征图谱。在融合操作之前,接着用32个1×1大小的卷积核遍历这16个特征图谱,所需参数为16×3×3+16×32×1×1=656个。
可以看出来depthwise separable convolution可以减少模型的参数。

通俗地理解就是卷积核厚度只有一层,然后在输入张量上一层一层地滑动,所以一个卷积核就对应了一个输出通道,当卷积完成后,在利用1x1的卷积调整厚度。

==不过Xception模型中的depthwise separable convolution和普通的不太一样,普通的depthwise separable convolution是先进行3x3操作再进行1x1操作(就好像mobileNet中的一样),而Xception模型中则是先进行1x1操作然后再进行3x3操作,中间为了保证数据不被破坏,没有添加relu层,而mobileNet添加了relu层。==在建立模型的时候,可以使用Keras中的SeparableConv2D层建立相应的功能。

对于Xception模型而言,其一共可以分为3个flow,分别是Entry flow、Middle flow、Exit flow;分为14个block,其中Entry flow中有4个、Middle flow中有8个、Exit flow中有2个。具体结构如下:

特点,优点:

(1)在Inception v3的基础上,把Inception模块替换为深度可分离卷积(此处的可分离卷积与mobilnet顺序颠倒,是先进行pointwise conv后进行depthwise conv),然后结合ResNet的跳跃连接,提出了Xception。

(2)Xception 在 ImageNet 上,比 Inception-v3 的准确率稍高, 同时参数量有所下降,在 Xception 中加入的类似 ResNet 的残差连接机制也显著加快了Xception的收敛过程并获得了显著更高的准确率。

(3)潜在的问题是,虽然 Depthwise Separable Convolution 可以带来准确率的提升或是理论计算量的大幅下降,但由于其计算过程较为零散,现有的卷积神经网络实现中它的效率都不够高,例如本文中 Xception 的理论计算量是远小于Inception-v3的,但其训练时的迭代速度反而更慢一些

代码:

keras实现:
def Xception(input_shape = [299,299,3],classes=1000):img_input = Input(shape=input_shape)#--------------------------## Entry flow#--------------------------##--------------------## block1#--------------------## 299,299,3 -> 149,149,64x = Conv2D(32, (3, 3), strides=(2, 2), use_bias=False, name='block1_conv1')(img_input)x = BatchNormalization(name='block1_conv1_bn')(x)x = Activation('relu', name='block1_conv1_act')(x)x = Conv2D(64, (3, 3), use_bias=False, name='block1_conv2')(x)x = BatchNormalization(name='block1_conv2_bn')(x)x = Activation('relu', name='block1_conv2_act')(x)#--------------------## block2#--------------------## 149,149,64 -> 75,75,128residual = Conv2D(128, (1, 1), strides=(2, 2), padding='same', use_bias=False)(x)residual = BatchNormalization()(residual)x = SeparableConv2D(128, (3, 3), padding='same', use_bias=False, name='block2_sepconv1')(x)x = BatchNormalization(name='block2_sepconv1_bn')(x)x = Activation('relu', name='block2_sepconv2_act')(x)x = SeparableConv2D(128, (3, 3), padding='same', use_bias=False, name='block2_sepconv2')(x)x = BatchNormalization(name='block2_sepconv2_bn')(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='block2_pool')(x)x = layers.add([x, residual])#--------------------## block3#--------------------## 75,75,128 -> 38,38,256residual = Conv2D(256, (1, 1), strides=(2, 2),padding='same', use_bias=False)(x)residual = BatchNormalization()(residual)x = Activation('relu', name='block3_sepconv1_act')(x)x = SeparableConv2D(256, (3, 3), padding='same', use_bias=False, name='block3_sepconv1')(x)x = BatchNormalization(name='block3_sepconv1_bn')(x)x = Activation('relu', name='block3_sepconv2_act')(x)x = SeparableConv2D(256, (3, 3), padding='same', use_bias=False, name='block3_sepconv2')(x)x = BatchNormalization(name='block3_sepconv2_bn')(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='block3_pool')(x)x = layers.add([x, residual])#--------------------## block4#--------------------## 38,38,256 -> 19,19,728residual = Conv2D(728, (1, 1), strides=(2, 2),padding='same', use_bias=False)(x)residual = BatchNormalization()(residual)x = Activation('relu', name='block4_sepconv1_act')(x)x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name='block4_sepconv1')(x)x = BatchNormalization(name='block4_sepconv1_bn')(x)x = Activation('relu', name='block4_sepconv2_act')(x)x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name='block4_sepconv2')(x)x = BatchNormalization(name='block4_sepconv2_bn')(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='block4_pool')(x)x = layers.add([x, residual])#--------------------------## Middle flow#--------------------------##--------------------## block5--block12#--------------------## 19,19,728 -> 19,19,728for i in range(8):residual = xprefix = 'block' + str(i + 5)x = Activation('relu', name=prefix + '_sepconv1_act')(x)x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name=prefix + '_sepconv1')(x)x = BatchNormalization(name=prefix + '_sepconv1_bn')(x)x = Activation('relu', name=prefix + '_sepconv2_act')(x)x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name=prefix + '_sepconv2')(x)x = BatchNormalization(name=prefix + '_sepconv2_bn')(x)x = Activation('relu', name=prefix + '_sepconv3_act')(x)x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name=prefix + '_sepconv3')(x)x = BatchNormalization(name=prefix + '_sepconv3_bn')(x)x = layers.add([x, residual])#--------------------------## Exit flow#--------------------------##--------------------## block13#--------------------## 19,19,728 -> 10,10,1024residual = Conv2D(1024, (1, 1), strides=(2, 2),padding='same', use_bias=False)(x)residual = BatchNormalization()(residual)x = Activation('relu', name='block13_sepconv1_act')(x)x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name='block13_sepconv1')(x)x = BatchNormalization(name='block13_sepconv1_bn')(x)x = Activation('relu', name='block13_sepconv2_act')(x)x = SeparableConv2D(1024, (3, 3), padding='same', use_bias=False, name='block13_sepconv2')(x)x = BatchNormalization(name='block13_sepconv2_bn')(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='block13_pool')(x)x = layers.add([x, residual])#--------------------## block14#--------------------## 10,10,1024 -> 10,10,2048x = SeparableConv2D(1536, (3, 3), padding='same', use_bias=False, name='block14_sepconv1')(x)x = BatchNormalization(name='block14_sepconv1_bn')(x)x = Activation('relu', name='block14_sepconv1_act')(x)x = SeparableConv2D(2048, (3, 3), padding='same', use_bias=False, name='block14_sepconv2')(x)x = BatchNormalization(name='block14_sepconv2_bn')(x)x = Activation('relu', name='block14_sepconv2_act')(x)x = GlobalAveragePooling2D(name='avg_pool')(x)x = Dense(classes, activation='softmax', name='predictions')(x)inputs = img_inputmodel = Model(inputs, x, name='xception')model.load_weights("xception_weights_tf_dim_ordering_tf_kernels.h5")return model

Xception总结相关推荐

  1. 【神经网络】(15) Xception 代码复现,网络解析,附Tensorflow完整代码

    各位同学好,今天和大家分享一下如何使用 Tensorflow 构建 Xception 神经网络模型. 在前面章节中,我已经介绍了很多种轻量化卷积神经网络模型,感兴趣的可以看一下:https://blo ...

  2. 迁移学习之InceptionV3(159层),Xception(126层),Inception_ResNet_V2(572层)(图像识别)

    文章目录 1.实现的效果: 2.结果分析: 3.主文件TransorInception.py: 1.实现的效果: 实际图片: (1)从上面的输出效果来看,InceptionV3预测的第一个结果为:ch ...

  3. 一文详解Inception家族的前世今生(从InceptionV1-V4、Xception)附全部代码实现

    [导读]今天将主要介绍Inception的家族及其前世今生.Inception 网络是 CNN 发展史上一个重要的里程碑.在 Inception 出现之前,大部分 CNN 仅仅是把卷积层堆叠得越来越多 ...

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

    from:https://blog.csdn.net/qq_14845119/article/details/73648100 Inception v1的网络,主要提出了Inceptionmodule ...

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

    ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 本文翻译自ResNet, AlexNet, VGG, Inception: Understanding va ...

  6. 深度学习100例 | 第24天-卷积神经网络(Xception):动物识别

    大家好,我是『K同学啊』! 之前写了一篇名为 「多图」图解10大CNN架构 的文章后,发现有些模型在我们的<深度学习100例>中并未介绍,后来不是说填坑嘛,之前已经写一篇 深度学习100例 ...

  7. DL之Xception:Xception算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

    DL之Xception:Xception算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 目录 Xception算法的简介(论文介绍) 1.论文使用的数据集 Xception算法的架构详 ...

  8. 关于「Xception」和「DeepLab V3+」的那些事

    作者丨崔权 学校丨早稻田大学硕士生 研究方向丨深度学习,计算机视觉 知乎专栏丨サイ桑的炼丹炉 前言 最近读了 Xception [1] 和 DeepLab V3+ [2] 的论文,觉得有必要总结一下这 ...

  9. 迁移学习--Xception

    一.Xception的概述 Xception是inception处于极端假设的一种网络结构.当卷积层试图在三维空间(两个空间维度和一个通道维度)进行卷积过程时,一个卷积核需要同时绘制跨通道相关性和空间 ...

  10. AI:IPPR的数学表示-CNN稀疏结构进化(Mobile、xception、Shuffle、SE、Dilated、Deformable)

    接上一篇:AI:IPPR的数学表示-CNN基础结构进化(Alex.ZF.Inception.Res.InceptionRes). 抄自于各个博客,有大量修改,如有疑问,请移步各个原文.....17年的 ...

最新文章

  1. yml配置文件中有特殊字符解决方案
  2. mysql为什么要转es_MySQL用得好好的,为什么要转ES?
  3. MAC 下的简单 SHELL 入门
  4. 【Arthas】Arthas 类查找和反编译原理
  5. java 快速从树节点找到数据_14期每日分享Java程序员分享超全哈希相关的知识
  6. Django项目:CRM(客户关系管理系统)--02--01PerfectCRM基本配置ADMIN02
  7. debian英文环境中中文输入
  8. 问题:安卓手机插入OTG摄像头时,如何禁用摄像头自带的MIC?
  9. Spring Boot入门(3)-数据库操作
  10. 网页报错404:The origin server did not find 的原因(持续更新带图并总结了其他博客的内容)
  11. 永中集成Office要敢于继续挑战微软Office
  12. YOLOv5 6.0 解决不显示Gflops方法:
  13. 谷歌、斯坦福联合发文:我们为什么一定要用大模型?
  14. 带有风的诗词_2017含有风的诗句大全
  15. R语言—Shiny框架
  16. reset.css(常用项目代码初始化)
  17. 租用国外服务器兴起的背景
  18. c语言around用法,around 的用法
  19. kmz转换为dwg_NX UG软件:带颜色的机器人工作站二维布局图JT格式文件转换方法...
  20. html的高度塌陷,html高度塌陷以及定位的理解

热门文章

  1. Kafka中副本机制的设计和原理
  2. 他一口气写出了这7k字的红黑树总结!看过的都说好!!|文末送书
  3. 很多未解之谜终于有答案了——2018年JVM生态系统报告出炉
  4. JWT/JJWT JSON WEB TOKEN介绍和使用
  5. 自动化集成:Kubernetes容器引擎详解
  6. Java描述设计模式(06):建造者模式
  7. 文件I/O实践(1) --基础API
  8. Datatables参数详解
  9. Java程序如何生成Jar、exe及安装文件
  10. 30款非常酷的创意名片设计欣赏