Xception --tensorflow2.x

news2024/10/7 8:24:24

简介

Xception和SqueezeNet一样,是一种降低参数量的轻量级神经网络,它主要使用了

  1. 深度分离卷积(Depthwise separable convolution)结构,该结构替换了原来的Inception中的多尺寸卷积结构。这里需要弄清深度分离卷积(Depthwise separable convolution)、深度卷积(depthwise convolution)、逐点卷积( pointwise convolution)、逐点分组卷积(pointwise group convolutions)的概念。深度可分离卷积分为两步,第一步为深度卷积,它是分组卷积的极限操作,即每组只有一个单通道卷积核;第二步为逐点卷积,也就是使用1x1的卷积核。

对比一下深度可分离卷积和普通卷积的区别:
下图为普通的卷积操作,每个卷积核对应通道与输入对应通道进行卷积操作后求和,输出通道数为卷积核数。
Figure1
下图为深度分离卷积操作的第一步-深度卷积,我是这样理解的,使用了一个卷积核通道数与输入通道数相等的卷积核,每个卷积核的通道与输入对应通道卷积操作后不进行求和(也可以这样理解,使用了多个(与输入通道数相等)单通道卷积核,每个卷积核负责输入的一个通道,卷积操作后不进行求和,而是Conact(深度方向堆叠),这样会得到与输入通道数(channels)相等的输出。
关于深度卷积和普通卷积的区别,这篇文章讲的也很清楚:
DepthwiseConv2D和Conv2D详解
在这里插入图片描述
下图为深度分离卷积操作的第二步-逐点卷积(pointwise convolution):就是使用1x1的普通卷积,输出通道数等与卷积核数(output channels ==filters)。
在这里插入图片描述

  1. 类似于ResNet,Xception引入了Residual module

Xception 网络结构

Xception引入了Entry flow、Middle flow、Exit flow三个flow,Entry flow主要用来不断下采样,减小空间维度;Middle flow用来学习关联关系,优化特征;Exit flow是汇总,整理特征,传递给全连接层表达信息。

在这里插入图片描述
上表中的Conv和SeparableConV由下面的Layer表示
在这里插入图片描述

代码

import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras import Model
class Conv(Model):#普通卷积块
    def __init__(self,filters=32,kernel_size=(3,3),strides=2):
        super().__init__()
        self.filters=filters
        self.kernel_size=kernel_size
        self.strides=strides
        self.layers1=[]
        self.layers1.append(Conv2D(filters=self.filters,kernel_size=self.kernel_size,strides=self.strides,padding='same'))
        self.layers1.append(BatchNormalization())
        self.layers1.append(Activation('relu'))                     
    def call(self,x):
        for layer in self.layers1.layers:
            x=layer(x)
        return x
class Separable_residual(Model):#深度可分卷积+残差块,用于Entry_flow和Exit_flow
    def __init__(self,mode=2,filters1=128,filters2=128):
        super().__init__()
        if mode==2:
            self.a1=Activation('relu')
        else:
            self.a1=Activation(None)
        self.c1=SeparableConv2D(filters=filters1,kernel_size=3,strides=1,padding='same')
        self.b1=BatchNormalization()
        
        self.a2=Activation('relu')
        self.c2=SeparableConv2D(filters=filters2,kernel_size=3,strides=1,padding='same')
        self.b2=BatchNormalization()
        
        self.p2=MaxPooling2D(pool_size=(3,3),strides=2,padding='same')
        self.residual=Conv(filters=filters2,kernel_size=1,strides=2)
    def call(self,x):
        residual=self.residual(x)
        x=self.a1(x)
        x=self.c1(x)
        x=self.b1(x)
        x=self.a2(x)
        x=self.c2(x)
        x=self.b2(x)
        x=self.p2(x)
        y=x+residual
        return y
class Middle_Separable_residual(Model):#middle_flow module
    def __init__(self):
        super().__init__()
        self.layers1=[]
        for i in range(3):
            self.layers1.append(Activation('relu'))
            self.layers1.append(SeparableConv2D(filters=728,kernel_size=3,padding='same'))
    def call(self,x):
        residual=x
        for layer in self.layers1.layers:
            x=layer(x)
        y=x+residual
        return y
def Entry_flow(x,filters_list):
    x=Conv()(x)
    x=Conv(filters=64,strides=1)(x)
    for filters in filters_list:
        if filters==128:
            x=Separable_residual(mode=1)(x)
        else:
            x=Separable_residual(2,filters,filters)(x)
    return x
def Middle_flow(x):
    x=Middle_Separable_residual()(x)
    return x
def Exit_flow(x):
    x=Separable_residual(mode=2,filters1=728,filters2=1024)(x)
    x=SeparableConv2D(filters=1536,kernel_size=3,padding='same')(x)
    x=Activation('relu')(x)
    x=SeparableConv2D(filters=2048,kernel_size=3,padding='same')(x)
    x=Activation('relu')(x)    
    x=GlobalAveragePooling2D()(x)
    x =Dense(1000, activation='softmax')(x)
    return x

def Xception(input,arg_list):
    x=Entry_flow(input,arg_list)
    x=Middle_flow(x)
    x=Exit_flow(x)
    return x
##用下面代码简单运行一下模型,验证其正确性
import numpy as np
inputs = np.zeros((1, 299, 299, 3), dtype=np.float32)
outputs = Xception(inputs,[128,256,728])
outputs.shape
        

这里的Xception没有用父类tensorflow.keras.Model封装起来,封装也挺简单,参考我之前写的其他模型就能封装,这里直接 def 函数建立模型。

参考

keras深度可分离卷积SeparableConv2D与DepthwiseConv2D
Xception 网络结构的原理与 Tensorflow2.0 实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【创建型设计模式-单例模式】一文搞懂单例模式的使用场景及代码实现的7种方式

1.什么是单例模式 在了解单例模式前,我们先来看一下它的定义: 确保一个类只有一个实例,而且自行实例化并且自行向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法, 单例模式是一种对象的创建型…

微型计算机原理速通期末复习

文章目录微机基础原码、反码、补码、移码溢出实数型功能结构8086/8088内部结构80286内部结构80386/80486内部结构标志寄存器FLAGS寄存器阵列段寄存器寻址标志寄存器EFLAGS分段结构数据寻址方式立即寻址直接寻址寄存器寻址寄存器间接寻址寄存器相对寻址基址-变址寻址基址-变址-相…

Solidity vs. Vyper:不同的智能合约语言的优缺点

本文探讨以下问题:哪种智能合约语言更有优势,Solidity 还是 Vyper?最近,关于哪种是“最好的”智能合约语言存在很多争论,当然了,每一种语言都有它的支持者。 这篇文章是为了回答这场辩论最根本的问题&…

磨金石教育摄影技能干货分享|中国风摄影大师——郎静山

说到中国风摄影,你想到的画面是什么样子的?故宫、长城、苏州园林、大红灯笼高高挂,反正离不开传承了千八百年的古建筑。仿佛没有了这些历史古董的元素就没有中国味道似的。 其实中国风,其内核应该是传统的审美观念和哲学思想。中…

【雷丰阳-谷粒商城 】课程概述

持续学习&持续更新中… 学习态度:守破离 【雷丰阳-谷粒商城 】课程概述该电商项目与其它项目的区别项目简介项目背景电商模式谷粒商城项目技术&特色项目前置要求谷粒商城-微服务架构图谷粒商城-微服务划分图参考该电商项目与其它项目的区别 互联网大型项目…

深入linux内核架构--内存管理

【推荐阅读】 代码大佬的【Linux内核开发笔记】分享,前人栽树后人乘凉! 一文了解Linux内核的Oops 一篇长文叙述Linux内核虚拟地址空间的基本概括 路由选择协议——RIP协议 深入理解Intel CPU体系结构【值得收藏!】 内存体系结构 1. UM…

银行测试人员谈测试需求

今天呢,想用故事说话,先看看啥叫用户需求挖掘。其实看完故事之后,我自己颇为震撼,请看。 故事一: 100多年前,福特公司的创始人亨利福特先生到处跑去问客户:“您需要一个什么样的更好的交通工具…

loganalyzer 展示数据库中的日志

1 实验目标: 利用rsyslog日志服务,将收集的日志记录于MySQL中,通过loganalyzer 展示数据库中的日志 2 环境准备 三台主机: 一台日志服务器,利用上一个案例实现,IP:192.168.100.100一台数据库…

【Java八股文总结】之数据结构

文章目录数据结构一、概念1、时间复杂度与空间复杂度2、常见算法时间复杂度3、Comparable二、常见的排序算法1、直接插入排序2、希尔排序3、选择排序4、堆排序5、冒泡排序6、快速排序7、归并排序8、二分查找算法Q:什么时候需要结束呢?三、线性表1、概念2…

使用 Footprint Analytics, 快速搭建区块链数据应用

Nov 2022, danielfootprint.network 如果你有一个处理 NFTs 或区块链的网站或应用程序,你可以在你的平台上直接向用户展示数据,以保持他们在网站或者应用内的参与,而不是链接以及跳出到其他网站。 对于任何区块链应用或者媒体、信息网站来说…

秦皇岛科学选育新品种 国稻种芯·中国水稻节:河北秸秆变肥料

秦皇岛科学选育新品种 国稻种芯中国水稻节:河北秸秆变肥料 秦皇岛新闻网 记者李妍 冀时客户端报道(河北台 张志刚 米弘钊 赵永鑫 通讯员 赵力楠) 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯…

无线通信技术概览

电生磁,磁生电 电场和磁场的关系,简而言之就是:变化的电场产生磁场,变化的磁场产生电场。 电荷的定向移动产生电流,电荷本身产生电场。电流是移动的电场。静止的电荷产生静止的电场,运动的电荷产生运动的电…

java实现阿里云rocketMQ消息的发送与消费(http协议sdk)

目录一、准备工作二、代码实现1.添加依赖2.创建一个常量类存放公共参数3.调用HTTP协议的SDK 发送普通消息4.调用HTTP协议的SDK 订阅普通消息三、配置main的日志输出级别四、测试效果五、完成代码一、准备工作 登录阿里云官网,先申请rocketMQ,再申请Topi…

一文带你了解PCB设计中的常用基本概念

本文将从初学者的角度出发,一文带你快速了解PCB设计中的常用基本概念:一、FR4板材FR-4就是玻璃纤维环氧树脂覆铜板,线路板中的一种基材,可以分为一般FR4板材和高TG FR4板材,Tg是玻璃转化温度,即熔点。电路板…

分享好玩的h5小游戏制作_为什么要做h5微信小游戏呢

近年来,市面上一直流行各种h5游戏,例如投票、答题、刮刮乐、大转盘等等等等,而且我在各种营销场景下经常看到它们的身影,是做促销,引流和宣传的神器之一! 那么,怎么做好玩的h5游戏?还…

DIXml v5.21.0 for Delphi 11

DIXml v5.21.0 for Delphi 11 DIXml是一个嵌入式XML、XSLT,也是Delphi的EXSLT处理库(Embarcadero//CodeGear/Borland)。它构建在libxml2、libxslt和libexslt库上,但不需要更多的DLL或其他外部文件。 DIXml很容易成为Delphi中功能最齐全的XML和XSLT替代品…

实战讲解MyBatis缓存:一级缓存和二级缓存(图+文+源码)

1 缘起 回顾SpringBoot如何进行事务管理相关知识的时, 发现使用Spring的注解Transational即可实现事务管理,完成回滚操作, 然而SpringBoot中使用MyBatis这个ORM框架操作数据库,实现CURD, 这两者有什么关系呢&#xff…

集合类不安全

ArryList集合 多线程下不安全;可能会报错:java.util.ConcurrentModificationException(并发修改异常) import java.util.*; import java.util.concurrent.CopyOnWriteArrayList;//java.util.ConcurrentModificationException 并发…

每日刷题3——牛客,算术转换和二级指针

更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发, 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我…

FFmpeg入门 - 视频播放

音视频最好从能够直接看到东西,也更加贴近用户的播放开始学起. 音视频编解码基础 我们可以通过http、rtmp或者本地的视频文件去播放视频。这里的"视频"实际上指的是mp4、avi这种既有音频也有视频的文件格式。 这样的视频文件可能会有多条轨道例如视频轨道、音频轨道…