Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >卷积神经网络学习路线(二十三)| 经典网络回顾之XceptionNet

卷积神经网络学习路线(二十三)| 经典网络回顾之XceptionNet

作者头像
BBuf
发布于 2020-04-02 09:05:00
发布于 2020-04-02 09:05:00
82900
代码可运行
举报
文章被收录于专栏:GiantPandaCVGiantPandaCV
运行总次数:0
代码可运行

❝Xception: Deep Learning with Depthwise Separable Convolutions❞

1.前言

卷积神经网络学习路线这个系列旨在盘点从古至今对当前CV影响很大的那些经典网络。为了保证完整性我会将之前漏掉的一些网络补充下去,已经介绍了非常多的经典网络,这个系列可能也快要迎来完结了。接着卷积神经网络学习路线(九)| 经典网络回顾之GoogLeNet系列 也就是Inception V3之后,Google提出了XceptionNet,这是对Inception V3的一种改进,主要使用了深度可分离卷积来替换掉Inception V3中的卷积操作。

2. 铺垫

为了更好的说明Xception网络,我们首先需要从Inception V3来回顾一下。下面的Figure1展示了Inception V3的结构图。可以看到Inception的核心思想是将多种特征提取方式如卷积,卷积,卷积,等产生的特征图进行了concate,达到融合多种特征的效果。

InceptionV3 结构

然后,从Inception V3的结构联想到了一个简化的Inception结构,如Figure2所示。

简化的Inception结构

再然后将Figure2的结构进行改进,就获得了Figure3所示的结构。可以看到,在这个结构中先用一个卷积,然后连接三个卷积,这三个卷积只将前面卷积的一部分(这里是的通道)作为每个卷积的输出。同时Figure4则为我们展示了将这一想法应用到极致,即每个通道接一个卷积的结构。

极致的Inception

3. Xception原理

Xception中主要采用了深度可分离卷积。这个卷积我们之前已经介绍的很清楚了,请看这篇推文:【综述】神经网络中不同种类的卷积层 。那么深度可分离卷积和上面Figure4中的极致Inception结构有什么区别呢?

  • 极致的Inception。
    • 第一步:普通的卷积。
    • 第二步:对卷积结果的每个channel,分别进行卷积操作,并将结果concate。
  • 深度可分离卷积。
    • 第一步:「Depthwise 卷积」 ,对输入的每个channel,分别进行卷积操作,并将结果concate。
    • 第二步:「Pointwise 卷积」 ,对 Depthwise 卷积中的concate结果,进行卷积操作。

可以看到两者的操作顺序是不一致的,Inception先进行卷积,再进行卷积,深度可分离卷积恰好相反。作者在论文中提到这个顺序差异并不会对网络精度产生大的影响。同时作者还有一个有趣的发现,在Figure4展示的「极致的 Inception”模块」中,用于学习空间相关性的卷积和用于学习通道相关性的卷积「之间」如果不使用激活函数,收敛过程会更快,并且结果更好,如下图所示。

点卷积之前是否使用激活函数实验

4. Xception网络结构

Xception的网络结构如Figure5所示。

Xception的结构

图里面的sparsableConv就是深度可分离卷积。另外,每个小块的连接采用的是residule connection(图中的加号),而不是原Inception中的concate。

5. 实验结果

Table1表示几种网络结构在ImageNet上的对比结果。

几种网络结构在ImageNet上的对比结果

Table2表示几种网络结构在「JFT数据集」上的对比。可以看到在大数据上的提升会比Table1好一点。

Table2

6. 总结

Xception主要是在Inception V3的基础上引入了深度可分离卷积,在基本不增加网络复杂度的前提下提高了模型的效果。

7. 代码实现

Keras代码实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from keras.models import Model
from keras import layers
from keras.layers import Dense, Input, BatchNormalization, Activation
from keras.layers import Conv2D, SeparableConv2D, MaxPooling2D, GlobalAveragePooling2D, GlobalMaxPooling2D
from keras.applications.imagenet_utils import _obtain_input_shape
from keras.utils.data_utils import get_file

WEIGHTS_PATH = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.4/xception_weights_tf_dim_ordering_tf_kernels.h5'

def Xception():

	# Determine proper input shape
	input_shape = _obtain_input_shape(None, default_size=299, min_size=71, data_format='channels_last', include_top=False)

	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)

	# Block 2 Pool
	x = MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)
	x = layers.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)

	# Block 3 Pool
	x = MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)
	x = layers.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 = layers.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 = layers.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 = BatchNormalization()(x)
	x = Activation('relu')(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 = layers.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 part 2
	x = SeparableConv2D(2048, (3, 3), padding='same', use_bias=False)(x)
	x = BatchNormalization()(x)
	x = Activation('relu')(x)

	# Fully Connected Layer
	x = GlobalAveragePooling2D()(x)
	x = Dense(1000, activation='softmax')(x)

	inputs = img_input

	# Create model
	model = Model(inputs, x, name='xception')

	# Download and cache the Xception weights file
	weights_path = get_file('xception_weights.h5', WEIGHTS_PATH, cache_subdir='models')

	# load weights
	model.load_weights(weights_path)

	return model

8. 参考

  • 论文原文:https://arxiv.org/abs/1610.02357
  • https://blog.csdn.net/u014380165/article/details/75142710
  • https://blog.csdn.net/lk3030/article/details/84847879
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GiantPandaCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官:“简述Xception中的深度可分离卷积”
的另一种改进,作者认为跨通道相关性和空间相关性应充分解耦(独立互不相关),因此最好不要将它们共同映射处理,应分而治之。具体是怎么做呢?
AIWalker
2021/07/05
6540
面试官:“简述Xception中的深度可分离卷积”
人脸表情识别系统介绍——上篇(python实现,含UI界面及完整代码)
人脸表情识别介绍与演示视频(视频链接:https://www.bilibili.com/video/BV18C4y1H7mH/)
全栈程序员站长
2022/08/11
1.9K0
人脸表情识别系统介绍——上篇(python实现,含UI界面及完整代码)
手机端运行卷积神经网络实现文档检测功能(二) -- 从 VGG 到 MobileNetV2 知识梳理(续)
从 MobileNet V1 到 MobileNet V2 ResNet、Inception、Xception 追求的目标,就是在达到更高的准确率的前提下,尽量在模型大小、模型运算速度、模型训练速度这几个指标之间找一个平衡点,如果在准确性上允许一定的损失,但是追求更小的模型和更快的速度,这就直接催生了 MobileNet 或类似的以手机端或嵌入式端为运行环境的网络结构的出现。 MobileNet V1 (https://arxiv.org/pdf/1704.04861.pdf) 和 MobileNet V
腾讯Bugly
2018/06/11
5.8K1
Python 深度学习第二版(GPT 重译)(四)
上一章通过简单模型(一堆Conv2D和MaxPooling2D层)和一个简单的用例(二进制图像分类)为您介绍了计算机视觉的深度学习。但是,计算机视觉不仅仅是图像分类!本章将深入探讨更多不同应用和高级最佳实践。
ApacheCN_飞龙
2024/03/21
2660
Python 深度学习第二版(GPT 重译)(四)
【说站】Python高级架构模式的整理
Python高级架构模式的整理 1、残差连接是目前常用的组件,解决了大规模深度学习模型梯度消失和瓶颈问题。 通常,在10层以上的模型中追加残差连接可能有帮助。 from keras import layers   x = ...   y = layers.Conv2D(128, 3, activation='relu', padding='same')(x) y = layers.Conv2D(128, 3, activation='relu', padding='same')(y) y = layer
很酷的站长
2022/11/26
2630
【说站】Python高级架构模式的整理
卷积_ResNet
刚才边写这个,别跑程序,偏偏没有选择自动保存,因此没得了,一个字也没有给我留下来,消耗了我所有的耐心。
火星娃统计
2021/11/02
3620
经典神经网络 | VGGNet 论文解析及代码实现
  卷积神经网络的输入是一个固定大小的224×224 RGB图像。做的唯一预处理是从每个像素中减去在训练集上计算的RGB平均值。图像通过一堆卷积(conv.)层传递,我们使用带有非常小的接受域的过滤器:3×3(这是捕捉左/右、上/下、中间概念的最小大小)。在其中一种配置中,我们还使用了1×1的卷积滤波器,它可以看作是输入通道的线性变换(其次是非线性)。卷积步幅固定为1像素;凹凸层输入的空间填充是卷积后保持空间分辨率,即3×3凹凸层的填充为1像素。空间池化由五个最大池化层执行,它们遵循一些对流层(不是所有对流层都遵循最大池化)。最大池是在一个2×2像素的窗口上执行的,步长为2。
墨明棋妙27
2022/09/23
6000
手机端运行卷积神经网络实现文档检测功能(二) -- 从 VGG 到 MobileNetV2 知识梳理
前言 这是 上一篇博客 ((http://fengjian0106.github.io/2017/05/08/Document-Scanning-With-TensorFlow-And-OpenCV/)) 的后续和补充,这次对边缘检测算法的升级优化,起源于一个意外事件,前一个版本是使用 TensorFlow 1.0 部署的, 并且是用 TF-Slim API 编写的代码,最近想使用 TensorFlow 1.7 重新部署一遍,本来以为是一件比较容易的事情,结果实操的时候才发现全是坑,首先遇到的就是废弃 A
腾讯Bugly
2018/06/11
2.1K3
扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积、激活、初始化、正则
我们对Keras应该已经有了一个直观、宏观的认识了。现在,我们来系统的学习一下Keras的一些关于网络层的API,本文的主要内容是围绕卷积展开的,包含以下的内容:
机器学习炼丹术
2020/10/15
1.9K0
resnet是卷积神经网络吗_神经网络架构搜索的应用
目前的常见的卷积网络结构有AlexNet、ZF Net、VGGNet、Inception、ResNet等等,接下来我们对这些架构一一详解。
全栈程序员站长
2022/09/21
8920
resnet是卷积神经网络吗_神经网络架构搜索的应用
keras系列︱Application中五款已训练模型、VGG16框架(Sequential式、Model式)解读(二)
根据给定的文章内容,撰写摘要总结。
悟乙己
2018/01/02
10K0
CV学习笔记(二十一):CRNN+CTC
上次的一篇文章说了下DenseNet,这一篇文章来说一下CRNN+CTC的识别原理以及实现过程。这篇文章原理部分主要参考于白裳老师的“一文读懂CRNN+CTC文字识别”,其中的CTC原理的讲解部分是我见过最清晰易懂的,值得好好读一下。
云时之间
2020/05/27
9660
[Deep-Learning-with-Python] Keras高级概念
目前为止,介绍的神经网络模型都是通过Sequential模型来实现的。Sequential模型假设神经网络模型只有一个输入一个输出,而且模型的网络层是线性堆叠在一起的。
用户1631856
2018/08/09
1.9K0
[Deep-Learning-with-Python] Keras高级概念
基于Keras进行迁移学习
机器学习中的迁移学习问题,关注如何保存解决一个问题时获得的知识,并将其应用于另一个相关的不同问题。
崔庆才
2019/09/04
1.9K0
基于Keras进行迁移学习
生成对抗网络项目:6~9
文本到图像的合成是生成对抗网络(GAN)的用例之一,它具有许多工业应用,就像前面章节中描述的 GAN 一样。 从文本描述中合成图像非常困难,因为要构建可以生成反映文本含义的图像的模型非常困难。 一个试图解决这个问题的网络是 StackGAN。 在本章中,我们将使用 TensorFlow 作为后端在 Keras 框架中实现 StackGAN。
ApacheCN_飞龙
2023/04/24
1.3K0
经典神经网络 | ResNet 论文解析及代码实现
论文题目:Deep Residual Learning for Image Recognition
墨明棋妙27
2022/09/23
1K0
keras TensorFlow_tensorflow 安装
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
9100
一文总览CNN网络架构演进:从LeNet到DenseNet
卷积神经网络可谓是现在深度学习领域中大红大紫的网络框架,尤其在计算机视觉领域更是一枝独秀。CNN从90年代的LeNet开始,21世纪初沉寂了10年,直到12年AlexNet开始又再焕发第二春,从ZF Net到VGG,GoogLeNet再到ResNet和最近的DenseNet,网络越来越深,架构越来越复杂,解决反向传播时梯度消失的方法也越来越巧妙。新年有假期,就好好总结一波CNN的各种经典架构吧,领略一下CNN的发展历程中各路大神之间的智慧碰撞之美。
小草AI
2019/05/29
9280
04.卷积神经网络 W2.深度卷积网络:实例探究(作业:Keras教程+ResNets残差网络)
Keras 是更高级的框架,对普通模型来说很友好,但是要实现更复杂的模型需要 TensorFlow 等低级的框架
Michael阿明
2021/02/19
8060
densenet详解_resnet详解
从2012年AlexNet大展身手以来,卷积神经网络经历了(LeNet、)AlexNet、ZFNet、VGGNet、GoogLeNet(借鉴Network in Network)、ResNet、DenseNet的大致发展路线。其实,自从ResNet提出之后,ResNet的变种网络层出不穷,各有特点,性能都略有提高。
全栈程序员站长
2022/11/10
1.7K0
densenet详解_resnet详解
推荐阅读
相关推荐
面试官:“简述Xception中的深度可分离卷积”
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档