【轻量级神经网络】MobileNet网络详解

news/2024/11/16 23:59:51/

文章目录

  • 1、深度卷积(Depthwise convolution)
  • 2、逐点卷积(Pointwise Convolution)
  • 3、深度可分离卷积(Depthwise Separable Convolution)
  • 4、Xception与MobileNet深度可分离卷积的区别

  • 深度学习领域内努力促使神经网络向小型化发展。在保证模型准确率的同时体积更小,速度更快。到了2016年直至现在,业内提出了SqueezeNet、ShuffleNet、NasNet、MnasNet以及MobileNet等轻量级网络模型。这些模型使移动终端、嵌入式设备运行神经网络模型成为可能。而MobileNet在轻量级神经网络中较具代表性。
  • MobileNet网络拥有更小的体积,更少的计算量,更高的精度。在轻量级神经网络中拥有极大的优势。

1、深度卷积(Depthwise convolution)

  • 深度卷积(Depthwise convolution, DW)不同于常规卷积操作,深度卷积中一个卷积核只有一维,负责一个通道,一个通道只被一个卷积核卷积,即没有各个通道进行卷积后相加的操作,因此卷积核个数与输入通道数相同,而且输出通道数也与输入通道数相同;常规卷积每个卷积核的维度与输入维度相同,每个通道单独做卷积运算后相加。
  • 以一张5x5x3(长和宽为5,RGB3通道)的彩色图片举例。每层深度卷积卷积核的数量与上一层的通道数相同(通道和卷积核一一对应)。设padding=1,stride=1,一个三通道的图像经过运算后生成了3个特征图,如下图所示:
    在这里插入图片描述
  • 深度卷积完成后的输出特征图通道数与输入层的通道数相同,无法扩展通道数。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的特征信息。因此需要逐点卷积来将生成的特征图进行组合生成新的特征图。

2、逐点卷积(Pointwise Convolution)

  • 逐点卷积(Pointwise Convolution, PW)的运算与标准的1*1卷积运算非常相似。
  • 逐点卷积卷积核大小为1×1xM(M为输入数据的维度),每次卷积一个像素的区域。逐点卷积运算会将上一层的特征图在深度(通道)方向上进行加权组合,生成新的特征图,新的特征图的大小与输入数据大小一致,这种卷积方式以较少的计算量进行降维或升维操作(改变输出数据的维度)。这种卷积被用来“混合”通道之间的信息。
  • 以一张5x5x3(长和宽为5,RGB3通道)的彩色图片举例,使用4个1x1x3的逐点卷积核进行卷积,逐点卷积运算后生成了4个特征图。这个例子是使用逐点卷积进行升维的操作,特征图从5x5x3 升维到5x5x4。如下图所示:
    在这里插入图片描述

3、深度可分离卷积(Depthwise Separable Convolution)

  • 从MobileNetV1开始,到V2、V3的线性瓶颈结构都大量使用了深度可分离卷积。
  • 深度可分离卷积(Depthwise Separable Convolution)是一种卷积结构。它是由一层深度卷积(Depthwise convolution)与一层逐点卷积(Pointwise Convolution)组合而成的,每一层卷积之后都紧跟着批规范化和ReLU激活函数。跟标准卷积的区别就是精度基本不变的情况下,参数与计算量都明显减少。
    在这里插入图片描述
  • 将深度卷积和逐点卷积组成深度可分离卷积后的示意图,如下图所示:
    在这里插入图片描述
  • 首先进行深度卷积操作,得出的特征图各通道之间是不关联的。接着进行逐点卷积把深度卷积输出的特征图各通道关联起来。
  • 深度可分离卷积使用了更小的空间代价(参数减少)和更少的时间代价(计算量更少)实现了标准卷积层一样的效果(提取特征)。
  • 一般的设Df为输入特征图边长,Dk为卷积核边长,特征图和卷积核均为长宽一致,输入通道数为M,输出通道数为N,则:
    • 标准卷积计算量为:Df×Df×Dk×Dk×M×N
    • 深度卷积的计算量为:Df×Df×Dk×Dk×M
    • 逐点卷积的计算量为:Df×Df×M×N
  • 上图所示实现输入特征图大小为5×5×3,输出特成图大小为5×5×4,设padding=1,stride=1,深度卷积卷积核大小为3×3,标准卷积也使用3×3尺寸卷积核。实现相同的卷积效果,参数量(不包含偏置)与计算量对比如下表所示:
    在这里插入图片描述
    在这里插入图片描述

4、Xception与MobileNet深度可分离卷积的区别

  • 事实上深度可分离卷积不是在MobileNetV1中第一次提出的,而是在2016年由谷歌的Xception网络结构中提出的。MobileNetV1在Xception的基础上,对深度可分离卷积进行了改进,做到了计算量与参数量的下降:
  • 假定M为输入层的通道数,N为输出层的通道数。
  • Xception的深度可分离卷积是由输入参数开始,使用1x1xMxN卷积将输入层的通道数转换为目标通道数,再通过3x3x1卷积核对每个通道进行卷积,每次卷积过后使用ReLU进行激活。
  • MobileNetV1的深度可分离卷积则是先使用3x3x1xM对输入层的每个通道分别卷积,之后通过1x1xMxN将输入层通道数转换为输出层通道数,每次卷积过后做一次批规范化操作,再使用ReLU进行激活。
  • 这里我们使用MobileNetV1网络结构的第一个深度可分离卷积层来举例,输入层维度为112x112x32,输出层维度为112x112x64,Xception与MobileNet的深度可分离卷积的计算量与参数个数对比如下表:
    在这里插入图片描述
    参考链接:https://blog.csdn.net/qq_37555071/article/details/108393809

http://www.ppmy.cn/news/1050037.html

相关文章

Webgl 存储限定符attribute、gl.getAttribLocation、gl.vertexAttrib3f及其同族函数和矢量版本的介绍

目录 attribute变量规范 获取attribute变量的存储位置 gl.getAttribLocation()函数的规范: 向attribute变量赋值 gl.vertexAttrib3f()的规范。 gl.vertexAttrib3f()的同族函数 示例代码…

【无监督】6、SimSiam | 基于孪生网络的对比学习的成功源于梯度截断!

文章目录 一、背景二、方法三、效果 论文:Exploring Simple Siamese Representation Learning 出处:FAIR | 何恺明大佬 本文作者抛出了两个爆炸💥性结论: 结论一:基于孪生网络的对比的学习的成功,不源于 …

php如何持续监听redis的消息订阅

要监听Redis服务&#xff0c;可以使用PHP的redis扩展提供的subscribe方法实现。以下是一个使用PHP监听Redis的示例代码&#xff1a; <?php $redis new Redis();// 连接到Redis服务器 $redis->connect(127.0.0.1, 6379);// 订阅频道 $redis->subscribe([channel_nam…

c++——增强了(全局变量、变量和函数的都要有类型、类型转换、struct结构体、bool类型和三目运算符)

c中全局变量、变量和函数的都要有类型、类型转换、struct结构体、bool类型和三目运算符的增强 一、c全局变量的增强 1、在C语言中全局变量的声明和定义 //全局变量 int a;//定义 int a;//声明 int a;//声明相同变量&#xff0c;第一个是定义&#xff0c;后面的的变量a都是声…

【LeetCode-中等题】128. 最长连续序列

题目 题解一&#xff1a;HeshSet枚举 思路&#xff1a;先对数组进行set去重&#xff0c;核心就是&#xff0c;先找出临界值&#xff08;假设以最小临界为例&#xff0c;那么这个临界值自己就是最小值&#xff0c;&#xff09;&#xff0c;以临界值不断做加1操作&#xff0c;看…

来自西安交大的chisel教程

第零章 序 Chisel教程汇总__iChthyosaur的博客-CSDN博客 来自西安交大的chisel教程 出过书

R语言数据整理技巧(1)-读写、数据类型、重构

1、读取和写入数据&#xff1a;xlsx&#xff1b;txt; rdata pathC:\\Users setwd(path) #读取 #读取csv read.csv(.csv) #读取txt read.txt(.txt) #读取剪贴板 read.table("clipboard") #读取xlsx library(readxl) read_xlsx(.xlsx) #读取rdata文件 load(.radta) #写…

vue-router在vue2/3区别

构建选项区别 vue2-router const router-new VueRouter({mode:history,base:_name,})vue-next-router import { createRouter,createWebHistory} from vue-next-router const routercreateRouter({history:createHistory(/) })在上述代码中我们发现,vue2中的构建选项mode和ba…