tensorflow2 MobileNet
创始人
2024-02-13 17:28:23
0

简介

深度学习的发展伴随着模型参数的暴涨,导致对运行模型的设备有很大的限制,普通的卷积神经网络模型难以运用到移动或嵌入式设备中,主要是这些设备的内存有限,其次这些设备的算力不能满足足够的响应速度,即实时性差,因此开发出一种能够在这些设备上运行的轻量级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,Cin⁣)\left( B,H,W,C_{in\!} \right)(B,H,W,Cin​),卷积核shape为(F,K1,K2)\left( F,K_1,K_2 \right)(F,K1​,K2​)。
对于普通卷积,参数量为:Cin×K1×K2×FC_{in}\times K_1\times K_2\times FCin​×K1​×K2​×F
,计算量为:Cin×K1×K2×F×H×WC_{in}\times K_1\times K_2\times F\times H\times WCin​×K1​×K2​×F×H×W
对于深度可分离卷积,参数量为:Cin×K1×K2+Cin×FC_{in}\times K_1\times K_2+C_{in}\times FCin​×K1​×K2​+Cin​×F
,计算量为:(Cin×K1×K2+Cin×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
两者计算量相比为
Cin×K1×K2×F×H×W(Cin×K1×K2+Cin×F)×H×W=F+K1×K2\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函数和它的导数:
Relu6(x)=min⁡(max⁡(x,0),6)∈[0,6)Relu6′(x)={1,01,00,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_multiplierself.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)
##

参考

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

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...