tensorflow2 MobileNet

news2025/8/11 6:29:19

简介

深度学习的发展伴随着模型参数的暴涨,导致对运行模型的设备有很大的限制,普通的卷积神经网络模型难以运用到移动或嵌入式设备中,主要是这些设备的内存有限,其次这些设备的算力不能满足足够的响应速度,即实时性差,因此开发出一种能够在这些设备上运行的轻量级CNN模型至关重要,目前对此类的研究主要有两种实现方式:

  • 压缩训练好的复杂模型

  • 直接设计小模型
    2017年,基于上述第二点,谷歌提出在移动设备上运行的轻量级CNN—MobileNetV1

  • 优点:占用内存小(参数量少),速度快(低延迟),精度高,易调试,这些优点正是普通CNN在移动设备上的短板。

  • 创新点:
    1、使用了depthwise separable convolution(深度可分离CNN)
    2、使用Relu6激活函数,提高模型精度和泛化能力
    3、引入缩减因子(Width Mutiplier、resolution multiplier),人为控制降低模型参数量

深度可分离卷积

深度可分离卷积分为两步,首先是深度卷积(depthwise convolution)也叫逐通道卷积,然后是逐点卷积(pointwise convolution)。与普通卷积相比,深度可分离极大降低了模型的参数量和计算量。
假设输入shape为 ( B , H , W , C i n  ⁣ ) \left( B,H,W,C_{in\!} \right) (B,H,W,Cin),卷积核shape为 ( F , K 1 , K 2 ) \left( F,K_1,K_2 \right) (F,K1,K2)
对于普通卷积,参数量为: C i n × K 1 × K 2 × F C_{in}\times K_1\times K_2\times F Cin×K1×K2×F
,计算量为: C i n × K 1 × K 2 × F × H × W C_{in}\times K_1\times K_2\times F\times H\times W Cin×K1×K2×F×H×W
对于深度可分离卷积,参数量为: C i n × K 1 × K 2 + C i n × F C_{in}\times K_1\times K_2+C_{in}\times F Cin×K1×K2+Cin×F
,计算量为: ( C i n × K 1 × K 2 + C i n × F ) × H × W \left( C_{in}\times K_1\times K_2+C_{in}\times F \right) \times H\times W (Cin×K1×K2+Cin×F)×H×W
两者计算量相比为
C i n × K 1 × K 2 × F × H × W ( C i n × K 1 × K 2 + C i n × F ) × H × W = F + K 1 × K 2 \frac{C_{in}\times K_1\times K_2\times F\times H\times W}{\left( C_{in}\times K_1\times K_2+C_{in}\times F \right) \times H\times W}=F+K1\times K_2 (Cin×K1×K2+Cin×F)×H×WCin×K1×K2×F×H×W=F+K1×K2
由上式可得到普通卷积计算量比深度可分离卷积的计算量大很多。

Relu6 激活函数

下式分别为Relu6函数和它的导数:
R e l u 6 ( x ) = min ⁡ ( max ⁡ ( x , 0 ) , 6 ) ∈ [ 0 , 6 ) R e l u 6 ′ ( x ) = { 1 , 0 < x < 6 0 , 其他 ∈ { 0 , 1 } \mathrm{Re}lu6\left( x \right) =\min \left( \max \left( x,0 \right) ,6 \right) \in \left[ 0,6 \right) \\ \mathrm{Re}lu6^{'}\left( x \right) =\begin{cases} 1,0<x<6\\ 0,\text{其他}\\ \end{cases}\in \left\{ 0,1 \right\} Relu6(x)=min(max(x,0),6)[0,6)Relu6(x)={1,0<x<60,其他{0,1}
请添加图片描述
上图看到,Relu函数的输出范围为0到无穷大,而Relu6的输出范围为0到6.
Relu6激活函数专为嵌入式设备设计,普通的激活函数输出范围为0到无穷大,而嵌入式设备采用的低精度float16无法描述如此大的范围,导致产生精度损失,所以RELU6应运而生,它在低精度计算下有更强的鲁棒性。

引入缩减因子(Width Mutiplier、resolution multiplier)

通过两个超参数对MobileNet基本模型进行轻量化,降低参数量和计算量。
Width Mutiplier主要用来按比例减少通道数,取值范围(0,1],使模型参数量按比例减少;
resolution multiplier主要用来按比例降低特征图尺寸,取值范围(0,1],使模型计算量按比例减少。

模型网络结构

在这里插入图片描述

最后,上代码

##激活函数用的Relu
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras import Model
import numpy as np
class Depth_Separable_Conv(Model):
    def __init__(self,s1=1,filters=64,s2=1,width_multiplier=1):
        super().__init__()
        self.layers_list=[]
        self.layers_list.append(DepthwiseConv2D(kernel_size=(3,3),strides=s1,padding='same'))
        self.layers_list.append(BatchNormalization())
        self.layers_list.append(Activation('relu'))
        self.layers_list.append(Conv2D(filters=round(filters * width_multiplier),kernel_size=1,strides=s2,padding='same'))
        self.layers_list.append(BatchNormalization())
        self.layers_list.append(Activation('relu'))
    def call(self,x):
        for layer in self.layers_list:
            x=layer(x)
        return x
class MobileNet(Model):
    def __init__(self,width_multiplier=1,resolution_multiplier=1):
        """ width_multiplier :通道缩减比例
            resolution multiplier:尺寸缩减比例
        """
        super().__init__()
        self.resolution_multiplier=resolution_multiplier
        self.layers_list=[]
        self.layers_list.append(Conv2D(filters=32,kernel_size=3,strides=2,padding='same'))
        self.layers_list.append(Depth_Separable_Conv(1,64,1,width_multiplier))
        self.layers_list.append(Depth_Separable_Conv(2,128,1,width_multiplier))
        self.layers_list.append(Depth_Separable_Conv(1,128,1,width_multiplier))
        self.layers_list.append(Depth_Separable_Conv(2,256,1,width_multiplier))
        self.layers_list.append(Depth_Separable_Conv(1,256,1,width_multiplier))
        self.layers_list.append(Depth_Separable_Conv(2,512,1,width_multiplier))
        for i in range(5):
            self.layers_list.append(Depth_Separable_Conv(1,512,1,1))
        self.layers_list.append(Depth_Separable_Conv(2,1024,1,1))
        self.layers_list.append(Depth_Separable_Conv(2,1024,1,1))
        self.layers_list.append(AveragePooling2D(pool_size=(7,7)))
        self.layers_list.append(Dense(1000,activation='softmax'))
    def call(self,x):
        re_size=round(x.shape[1] * self.resolution_multiplier)
        x=tf.image.resize(images=x, size=[re_size,re_size])
        for layer in self.layers_list:
            x=layer(x)
        return x
model=MobileNet()
##用随机image验证模型的正确性,能输出预期的结果
x=range(112*112)
x=np.array(x).reshape(1,112,112,1)
x.shape
model(x)
##<tf.Tensor: shape=(1, 0, 0, 1000), dtype=float32, numpy=array([], shape=(1, 0, 0, 1000), dtype=float32)>

参考

CNN模型之MobileNet
MobileNet教程:用TensorFlow搭建在手机上运行的图像分类器
卷积神经网络学习笔记——轻量化网络MobileNet系列(V1,V2,V3)
MobileNet系列(万文长字详细讲解,一篇足以)
轻量级神经网络“巡礼”(二)—— MobileNet,从V1到V3

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

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

相关文章

[附源码]java毕业设计疫情期间回乡人员管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Swin Transformer目标检测实验——环境配置的步骤和避坑

Swin Transformer1. 网上基础教程&#xff08;带视频讲解&#xff09;2. 配置虚拟环境时遇到的一些问题&#xff08;按操作顺序排列&#xff09;1. 网上基础教程&#xff08;带视频讲解&#xff09; 大家是不是都从b站来的呀&#xff0c;先给你们基础环境的配置和搭配的视频教…

【SQLite】三、SQLite 的常用语法

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲…

[论文阅读笔记18] DiffusionDet论文笔记与代码解读

扩散模型近期在图像生成领域很火, 没想到很快就被用在了检测上. 打算对这篇论文做一个笔记. 论文地址: 论文 代码: 代码 0. 扩散模型简述 首先介绍什么是扩散模型. 我们考虑生成任务, 即encoder-decoder形式的模型, encoder提取输入的抽象信息, 并尝试在decoder中恢复出来. 扩…

亚马逊鲲鹏系统:批量注册亚马逊买家号软件

之前我们有谈到过&#xff0c;想要注册亚马逊买家号&#xff0c;需要邮箱、ip、信用卡、收货地址和手机号。自己手动注册一个一个的太麻烦&#xff0c;还会花费大量的时间&#xff0c;那么有没有可以节约时间的自动化操作软件呢&#xff1f;想要自动化操作软件&#xff0c;来试…

金属带宽度测量方案

一、硬件部分 1.相机 像素&#xff1a;4864*3232 相机选择 1600 万像素即 4864*3232&#xff0c;即检测视场长宽比为 3&#xff1a;2 工件最大的直径为 320mm&#xff0c;假设检测的视场范围为 510*340 因 此 每 个 像 素 大 小 为 340mm/32800.104mm &#xff0c; 即 检 测 精…

数组形式的整数加法

1 问题 整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。 例如&#xff0c;对于 num 1321 &#xff0c;数组形式是 [1,3,2,1] 。 给定 num &#xff0c;整数的 数组形式 &#xff0c;和整数 k &#xff0c;返回 整数 num k 的 数组形式 。 2 方法 根据问题的描述…

ROS中使用protoBuf通信

ROS自身话题也挺好的&#xff0c;不过暂时还不知道如何判断网络&#xff0c;因此&#xff0c;还是想换回tcp/udp通信。 但是发现通信时数据比较多&#xff0c;调查一下&#xff0c;发现ROS支持google的protoBuf。 先建立一个ROS的项目&#xff0c;方便后面我们测试。 然后建立…

疫情物资储藏库建设规划问题,使用matlab+cplex+yalmib求解

疫情物资储藏库建设规划问题&#xff0c;使用matlabcplexyalmib求解一、Cplex安装及配置二、yalmib安装及配置三、案例分析一、Cplex安装及配置 一、安装Cplex Cplex 是一款商业化的规划问题求解器&#xff0c;支持python和matlab等常用语言&#xff0c;功能非常强大。可以根据…

19 0A-检索服务器支持的所有DTC的状态

诊断协议那些事儿 诊断协议那些事儿专栏系列文章&#xff0c;19服务作为UDS中子功能最多的服务&#xff0c;一共有28种子功能&#xff0c;本文将介绍常用的19 0A服务&#xff1a;检索服务器支持的所有DTC的状态。此子功能不论DTC是否发生、状态如何&#xff0c;都让ECU返回所有…

1533_AURIX_TriCore内核架构_指令集信息

全部学习汇总&#xff1a; GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com) 学习的顺序有一点调整&#xff0c;切换到了内核的第二卷。先了解一下指令集的基本信息。第二卷主要就是讲指令集以及扩展的&#xff0c;而且基本上只…

RSA加密算法Python实现

RSA加密算法Python实现1.RSA算法简介2.RSA算法涉及的数学知识2.1互素2.2 欧拉定理2.3求模逆元2.4 取模运算2.5 最大公因数2.6 最小公倍数2.7 欧几里得算法2.8 扩展欧几里得算法3.RSA算法数学实现3.1理论3.2实践4.RSA算法代码实现4.1RSA算法代码实现14.1RSA算法代码实现21.RSA算…

STP、RSTP、MSTP

STP、RSTP、MSTP的配置 本篇介绍STP、RSTP、MSTP的配置和常用的管理命令。 STP/RSTP/MSTP简介 以太网中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路&#xff0c;但是这也带来了网络环路的问题。网络环路会引发广播风暴和MAC地址表振荡等问题…

连续仨月霸占牛客榜首,京东 T8 呕心沥血神作:700 页 JVM 虚拟机实战手册

虚拟机是一种抽象化的计算机&#xff0c;通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java 虚拟机有自己完善的硬体架构&#xff0c;如处理器、堆栈、寄存器等&#xff0c;还具有相应的指令系统。JVM 屏蔽了与具体操作系统平台相关的信息&#xff0c;使得 Java 程序只…

基于结构应力方法的焊接结构疲劳评估及实例分析(下篇)

作者 | 裴宪军 &#xff0c;仿真秀专栏作者 一、写在文前 焊接技术作为现代制造业中的支柱技术之一&#xff0c;是制造强国的关键保障。由于其整体性强、轻量化、经济性好等优点&#xff0c;焊接结构被广泛应用于轨道交通、航空航天&#xff0c;船舶、重型装备等领域&#xf…

LinkedIn领英开发客户方法大全(篇一)

一、准备工作 &#xff08;绝对不能小看准备工作&#xff01;&#xff01;&#xff01;&#xff01;所以我写的很详细&#xff01;&#xff01;&#xff01;&#xff09; 1.建议大家使用网页版的领英开发客户&#xff0c;并且界面语言要切换为英文&#xff01;&#xff01; 领…

你听说过LabVIEW吗?

LabVIEW是美国国家仪器公司NI的图形化的编程语言&#xff0c;LabVIEW的全称是Laboratory Virtual Instrument Engineering Workbench&#xff0c;平时我们常见的Python、C/C、Java编程语言虽然也分编译型语言和解释型语言、底层语言和高级语言等&#xff0c;但基本都是文字形式…

[附源码]java毕业设计疫情状态下病房管理平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Spring 如何解决循环依赖

1.什么是循环依赖&#xff1f; 循环依赖就是循环引用&#xff0c;就是两个或多个Bean相互之间的持有对方&#xff0c;比如A引用B&#xff0c;B引用C&#xff0c;C引用A&#xff0c;则它们最终反映为一个环。 我们这里以两个类A和B为例进行讲解&#xff0c;如下是A和B的声明&a…

MCE | 丙型肝炎病毒的终结之路

Harvey J. Alter 对输血相关性肝炎的系统研究表明&#xff0c;一种未知病毒是慢性肝炎的常见病因&#xff1b;Michael Houghton 使用了一种未经验证的策略&#xff0c;分离了新病毒丙型肝炎病毒 (Hepatitis C virus) 的基因组&#xff1b;Charles M. Rice 提供了最终的证据&…