MobileNet

news2024/12/26 23:13:47

MobileNet

文章目录

        • MobileNet
          • 单词
            • 重要
            • 不重要
          • 摘要
          • MobileNetV1
            • Motivation
            • 深度可分离卷积
            • 逐通道卷积(Depthwise Convolution)
            • 逐点卷积(Pointwise Convolution)
            • 参数对比
            • 计算量对比
          • V2
            • Inverted Residuals
            • Linear Bottlnecks
            • Model Architecture
            • 总结:

参考学习资料:http://124.220.164.99:8090/archives/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%9B%BE%E5%83%8F%E5%88%86%E7%B1%BB%E4%B9%9Dmobilenet%E7%B3%BB%E5%88%97v1v1v3#3.-model-architecture

单词
重要

depthwise separable convolutions 深度可分离卷积

hyper-parameter 超参数

不重要

ubiquitous 无处不在的

optimizing 优化

摘要

We present a class of efficient models called MobileNets for mobile and embedded vision applications. MobileNets are based on a streamlined architecture that uses depthwise separable convolutions to build light weight deep neural networks. We introduce two simple global hyper-parameters that efficiently trade off between latency and accuracy. These hyper-parameters allow the model builder to choose the right sized model for their application based on the constraints of the problem. We present extensive experiments on resource and accuracy tradeoffs and show strong performance compared to other popular models on ImageNet classification. We then demonstrate the effectiveness of MobileNets across a wide range of applications and use cases including object detection, finegrain classification, face attributes and large scale geo-localization.

我们提出了一类有效的模型,称为MobileNets,用于移动和嵌入式视觉应用。MobileNets 基于流线型架构,该架构使用深度可分离卷积来构建轻量级深度神经网络。我们引入了两个简单的全局超参数,可以有效地权衡延迟和准确性。这些超参数允许模型构建器根据问题的约束为其应用程序选择正确的大小模型。我们对资源和准确性权衡进行了广泛的实验,并在 ImageNet 分类上展示了与其他流行模型相比的强大性能。然后,我们展示了MobileNets在广泛的应用程序和用例中的有效性,包括对象检测、细粒度分类、人脸属性和大规模地理定位。

MobileNetV1
Motivation
  • The general trend has been to make deeper and more complicated networks in order to achieve higher accuracy. However, these advances to improve accuracy are not necessarily making networks more efficient with respect to size and speed. In many real world applications such as robotics, self-driving car and augmented reality, the recognition tasks need to be carried out in a timely fashion on a computationally limited platform.

  • 总体趋势是制作更深、更复杂的网络,以达到更高的精度。然而,提高准确性的这些进步并不一定使网络在大小和速度方面更有效。在许多现实世界的应用中,如机器人、自动驾驶汽车和增强现实,识别任务需要在计算有限的平台上及时执行

卷积神经网络(CNN)已经普遍应用在计算机视觉领域,并且已经取得了不错的效果。但是,近几年来CNN在ImageNet竞赛的表现可以看到,为了追求分类准确度,模型深度越来越深,模型复杂度也越来越高,如深度残差网络(ResNet)其层数已经多达152层。然而,在某些真实的应用场景如移动或者嵌入式设备,如此大而复杂的模型是难以被应用的。

首先是模型过于庞大,面临着内存不足的问题,其次这些场景要求低延迟,或者说响应速度要快,想象一下自动驾驶汽车的行人检测系统如果速度很慢会发生什么可怕的事情。所以,研究小而高效的CNN模型在这些场景至关重要,至少目前是这样,尽管未来硬件也会越来越快。

目前的研究总结来看分为两个方向一是对训练好的复杂模型进行压缩得到小模型,也就是业界常说的模型量化;二是直接设计小模型并进行训练。不管如何,其目标在保持模型性能(accuracy)的前提下降低模型大小(parameters size),同时提升模型速度(speed, low latency)。

本文的主角MobileNet系列的网络属于后者,是Google最近提出的一种小巧而高效的CNN模型,其在accuracy和latency之间做了折中。下面对MobileNet做详细的介绍。

  • This paper describes an efficient network architecture and a set of two hyper-parameters in order to build very small, low latency models that can be easily matched to the design requirements for mobile and embedded vision applications.

  • 本文描述了一种高效的网络架构和一组两个超参数,以构建非常小的、低延迟的模型,可以很容易地与移动和嵌入式视觉应用的设计要求相匹配

深度可分离卷积

MobileNetV1之所以轻量,与深度可分离卷积的关系密不可分。

image-20230627143516806

如上图所示,模型推理中卷积操作占用了大部分的时间,因此MobileNetV1使用了深度可分离卷积对卷积操作做了进一步的优化,具体解释如下:

常规卷积操作

对于5x5x3的输入,如果想要得到3x3x4的feature map,那么卷积核的shape为3x3x3x4;如果padding=1,那么输出的feature map为5x5x4,如下图:

image-20230627143606064

卷积层共4个Filter,每个Filter包含一个通道数为3(与输入信息通道相同),且尺寸为3×3的kernel。因此卷积层的参数数量可以用如下公式来计算(即:卷积核W x 卷积核H x 输入通道数 x 输出通道数):

N_std = 3 × 3 × 3 × 4= 108

计算量可以用如下公式来计算(即:卷积核W x 卷积核H x (图片W-卷积核W+1) x (图片H-卷积核H+1) x 输入通道数 x 输出通道数):

C_std = 3 * 3 * (5 - 3 + 1) * (5 - 3 + 1) * 3 * 4 = 972

深度可分离卷积 主要是两种卷积变体组合使用,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)

逐通道卷积(Depthwise Convolution)

Depthwise Convolution的一个卷积核只有一个通道,输入信息的一个通道只被一个卷积核卷积,这个过程产生的feature map通道数和输入的通道数完全一样,如下图所示:

image-20230627144001503

一张5×5像素、三通道彩色输入图片(shape为5×5×3),Depthwise Convolution每个卷积核只负责计算输入信息的某一个通道。卷积核的数量与输入信息的通道数相同。所以一个三通道的图像经过运算后一定是生成了3个Feature map。卷积核的shape即为:(卷积核W x 卷积核H x 输入通道数)。

此时,卷积部分的参数个数计算如下( 卷积核W x 卷积核H x 输入通道数),即:

N_depthwise = 3 × 3 × 3 = 27

我感觉公式肯定和上面都是一样的,那这里少乘了一个输出通道数,那就说明输出通道数是1?????????

但输出通道数应该为3才对啊,那我认为应该是输入通道为1,输出通道为3

但是看图片中的卷积层就很好算了,3 * 3 * 1的卷积核,一共有3个,所以参数量是 3 * 3 * 3

计算量为( 卷积核W x 卷积核H x (图片W-卷积核W+1) x (图片H-卷积核H+1) x 输入通道数)即:

C_depthwise = 3 x 3 x (5 - 3 + 1) x (5 - 3 + 1) x 3 = 243

Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法在通道维度上扩展或压缩Feature map的数量。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的features的相关性。**简而言之,虽然减少了计算量,但是失去了通道维度上的信息交互。**因此需要Pointwise Convolution来将这些Feature maps进行组合生成新的Feature maps。

逐点卷积(Pointwise Convolution)

Pointwise Convolution的运算与常规卷积运算非常相似,其实就是1X1的卷积。它的卷积核的尺寸为 1×1×M,M为上一层输出信息的通道数。所以这里Pointwise Convolution的每个卷积核会将上一步的feature maps在通道方向上进行加权组合,生成新的feature map。有几个卷积核就有几个输出多少个新的feature maps。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RwcD6dnx-1687935902408)(https://gitee.com/aure0219/typora-img/raw/master/202306271443269.png)]

由于采用的是1×1卷积的方式,此步中卷积涉及到的参数个数可以计算为(1 x 1 x 输入通道数 x 输出通道数):

N_pointwise = 1 × 1 × 3 × 4 = 12

计算量则为(1 x 1 x 特征层W x 特征层H x 输入通道数 x 输出通道数):

C_pointwise = 1 × 1 × 3 × 3 × 3 × 4 = 108

经过Pointwise Convolution之后,由四个卷积核输出了4张Feature map,与常规卷积的输出维度相同。

参数对比

回顾一下,常规卷积的参数个数为

N_std = 4 × 3 × 3 × 3 = 108

Depthwise Separable Convolution的参数由两部分相加得到

N_depthwise = 3 × 3 × 3 = 27

N_pointwise = 1 × 1 × 3 × 4 = 12

N_separable = N_depthwise + N_pointwise = 39

相同的输入,同样是得到4张Feature map,Separable Convolution的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Depthwise Separable Convolution的神经网络层数可以做的更深。

计算量对比

回顾一下,常规卷积的计算量为

C_std = 3 * 3 * (5 - 3 + 1) * (5 - 3 + 1) * 3 * 4 = 972

Depthwise Separable Convolution的参数由两部分相加得到

C_depthwise = 3 x 3 x (5 - 3 + 1) x (5 - 3 + 1) x 3 = 243

C_pointwise = 1 × 1 × 3 × 3 × 3 × 4 = 108

C_separable = C_depthwise + C_pointwise = 351

相同的输入,同样是得到4张Feature map,Separable Convolution的计算量也是常规卷积的约1/3。因此,在计算量相同的情况下,Depthwise Separable Convolution可以将神经网络层数可以做的更深。

image-20230627162048974

第二层是逐通道卷积,第三层是逐点卷积,两个加起来是深度可分离卷积

s1代表步长为1,s2代表步长为2

V2

原始论文:MobileNetV2: Inverted Residuals and Linear Bottlenecks。

V2 中主要用到了 Inverted Residuals 和 Linear Bottlnecks。

Inverted Residuals

我们看到 V1 的网络结构还是非常传统的直桶模型(没有旁路),但是 ResNet在模型中引入旁路并取得了很好的效果,因此到了 V2 的时候,作者也想引入进来,这就有了我们要探讨的问题了。

首先我们看下ResNet BottleNeck Block。下图可以看到,采用 1x1 的卷积核先将 256 维度降到 64 维,经过 3x3 的卷积这后,然后又通过 1x1 的卷积核恢复到 256 维。

image-20230628111005029

我们要把 ResNet BottleNeck Block 运用到 MobileNet 中来的话,如果我们还是采用相同的策略显然是有问题的,因为 MobileNet 中由于逐通道卷积,本来 feature 的维度就不多,如果还要先压缩的话,会使模型太小了,所以作者提出了 Inverted Residuals,即先扩展(6倍)后压缩,这样就不会使模型被压缩的太厉害。 下图对比了原始残差和反转残差结构:

image-20230628141747457

Linear Bottlnecks

Linear Bottlnecks 听起来很高级,其实就是把上面的 Inverted Residuals block 中的 bottleneck 处的 ReLU 去掉。

那为什么要去掉呢?而且为什么是去掉最后一个1X1卷积后面的 ReLU 呢?因为在训练 MobileNet V1 的时候发现最后 Depthwise 部分的 kernel 训练容易失去作用,最终再经过ReLU出现输出为0的情况。作者发现是因为ReLU 会对 channel 数较低的张量造成较大的信息损耗,因此执行降维的卷积层后面不会接类似于ReLU这样的非线性激活层。说人话就是:1X1卷积降维操作本来就会丢失一部分信息,而加上 ReLU 之后那是雪上加霜,所以去掉 ReLU 缓一缓。

n_dim = 10

image-20230628141336336

n_dim = 5

image-20230628141428197

n_dim = 2

image-20230628141454044

结论就是当n_dim越小,通过矩阵的逆得到的螺旋图与原图差的越多

把最后一个relu函数去掉后,发现输出的就与原图一样了

image-20230628142715343

test.py代码:

import numpy as np
import matplotlib.pyplot as plt

m_dim = 1000
n_dim = 2


##创建螺旋图
def create_spiral(m_dim):
    x=[]
    y=[]
    for theta in np.linspace(0,20*np.pi,m_dim):
        r = ((theta)**2)
        x.append(r*np.cos(theta))
        y.append(r*np.sin(theta))
    
    return np.array([x,y])

def relu(input):
    return np.maximum(input,0)

def show_image(image,title,column):
    [x,y] = image
    plt.subplot(1,2,column)
    plt.title(title)
    
    plt.plot(x,y)
    # plt.show()

input = create_spiral(m_dim)
show_image(input,"Input",1)

T = np.random.rand(n_dim, 2) - 0.5 #(-0.5,0.5)
layer_out = np.dot(T,input) #w*x 即权重*x 模拟神经网络

layer_output = relu(layer_out)

T_ni = np.linalg.pinv(T) ##计算T的逆矩阵

out = np.dot(T_ni,layer_out) ##out = T^(-1) * y

show_image(out,"output",2)
plt.show()
Model Architecture

完整的MobileNetV2的网络结构参数如下:
t代表反转残差中第一个1X1卷积升为的倍数;c代表通道数;n代表堆叠bottleneck的次数;s代表DWconv的幅度(1或2)。不同的步幅对应了不同的模块

image-20230628144135219

总结:

MobileNetV2最大的贡献就是改进了通道数较少的网络运用残差连接的方式:设计了反转残差(Inverted Residuals)的结构。另外,提出了Linear Bottlnecks的模型设计技巧。

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

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

相关文章

使用docker进行upload-labs靶场的安装搭建

由于我是在kali上搭建,默认没有docker服务,这里就从按照docker开始讲解 一、docker按装 1、Linux内核版本查看 #如果你是kali可直接从第四步开始 #安装docker要求内核版本kerner>3.10 #为此,先检查当前Linux系统的内核版本 uname -a2…

分析Spring Boot项目启动慢原因之 《一》打印bean耗时

分析Spring Boot项目启动原因之 一 打印bean耗时 由于项目比较久远,积累的代码犹如屎山,然后项目启动也特别慢,然后产生想要优化一下启动速度,故写了一个Bean启动时的耗时分析:package com.tekrally.assetManagement.u…

【Linux】Haproxy搭建Web群集

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Haproxy搭建Web群集 一、Haproxy概述1.常见的Web集群调度器2.Haproxy应用分析3.Haproxy常用调度算法4.Haproxy的主要特性5.LVS、Nginx、Haproxy的区别 二、Haproxy搭建Web群集…

【算法题解】49. 二叉树的序列化与反序列化

这是一道 困难 题 https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/ 文章目录 题目深度优先搜索(前序遍历)Java 代码实现Go 代码实现复杂度分析 广度优先搜索(层序遍历)Java 代码实现Go 代码实现复杂度分析 …

容器的本质是什么

广义上来说,容器技术是动态的容器、静态的镜像和远端的仓库这三者的组合。 容器,就是一个特殊的隔离环境,它能够让进程只看到这个环境里的有限信息,不能对外界环境施加影响。 对于 Linux 操作系统来说,一个不受任何限…

【区块链】常见共识机制汇总

文章目录 公有链PoW - Proof of WorkPoS - Proof of StakeDPoS - Delegate Proof of StakePoA - Proof of Activity - 行动证明PoB - Proof of Burn 联盟链PaxosMulti-PaxosPBFTDDBFTIDBFTHotstuffZyzzyvaPoETCasperOurobrosPoSVMG-DPoSRPCAAlgorandTendermint 私有链 公有链 P…

用python实现扫雷游戏

前言 本人最近在学习python语言,发现python是一门很有意思的语音。python有大量的库,大量的函数,可以实现非常多的功能。尤其是在可视化方面,可以画图,可以弹出窗口。于是我就想着看能不能用python编写一个扫雷游戏。…

5. 创建声卡

代码位置 sound/soc/generic/simple-card.c static int asoc_simple_card_probe(struct platform_device *pdev) {...ret devm_snd_soc_register_card(dev, card);... } asoc_simple_card_probe -> devm_snd_soc_register_card -> snd_soc_register_card int snd_soc_r…

MS1825 SDK 移植指南

1. 概述 MS1825 SDK 支持以下 Macrosilicon 芯片,按照芯片功能组合的不同, SDK 中相关 API 和类型的定义有所 不同,请在该文档 API 和类型说明时特别关注: MS1825 SDK 的作用是帮助用户建立基于 MS1825 的视频输入输…

力扣 17. 电话号码的字母组合

题目来源:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/ C题解: 递归法。 确定回溯函数参数:首先需要一个字符串s来收集叶子节点的结果,一个字符串数组result保存起来,定义为全局…

78-基于stm32单片机电压电流检测LCD1602显示(程序+原理图+元件清单全套资料)...

资料编号:078 功能介绍:采用stm32单片机作为主控CPU,采用精密电阻分压将高电压分压后接入STM32单片机ADC接口,采用ADC可以采集出当前的电压值,通过功率电阻来测量电路中的电流,通过串联电路电流相同的原理&…

正则表达式 教程与简介 | 一看就懂!!!(一)

目录 一、正则表达式 - 教程 二、 正则表达式的模式 (一)字面值字符 (二)特殊字符 (三)字符类 (四)元字符 (五)量词 (六)边界…

如何进行小红书笔记关键词布局,热词分析!

坐拥2.6亿活跃用户,小红书已经成为品牌宣推、种草的重要平台之一。那么品牌进入平台,如何进行小红书笔记关键词布局,热词分析! 一、 如何确定关键词 想要做好小红书关键词布局,首先要明确如何确定关键词。 1、当我们要…

shell判断程序是否运行,守护进程

一、需求 服务部署在linux上,要求服务器上的服务可以一直保持正常运行 二、问题 在linux上部署的微服务,不知道什么原因过一段时间就自己停掉了,无法启动。 三、解决办法 添加angle守护进程,通过定时执行脚本来判断程序是否运行…

为什么对ChatGPT、ChatGLM这样的大语言模型说“你是某某领域专家”,它的回答会有效得多?(一)...

“ 太长不看总结版:LLM大模型的本质在于计算某个词汇后面应该跟着哪些词汇的概率。当问题给定了特定的限定范围后,它能够找到一条相对明确的计算路径,从一系列概率分布中挑选出所需的答案。否则,它会根据最常见且最高概率的组合方…

浑元太极马老师和小薇-UMLChina建模知识竞赛第4赛季第7轮[更新]

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 第7轮一直无人得分,再次更换题目。 因有的题目之前已经出过,本轮需要最先答对全…

聊天室(二)__ unipush 推送如何实现?

你想搞个自己的聊天室 app 吗?好多前端同学会好奇聊天室app的推送是怎么搞的?今天就以前端同学使用最多的 uniapp 开发的 app 推送为例,悄悄告诉大家推送是如何实现的! 项目技术栈: 项目基于 vue3 的 uniapp 推送基于…

从小白到大神之路之学习运维第51天---第三阶段----redis高可用集群数据库的安装部署

第三阶段基础 时 间:2023年7月3日 参加人:全班人员 内 容: 生产级redis cluster部署 目录 一、环境配置:【两台服务器】 二、redis多实例配置: 三、构建redis cluster集群 四、生产集群部署 五、集群故障切…

Makefile:1: *** 遗漏分隔符 (null)。 停止。解决方法

在使用ubuntu时,make命令后,直接弹出了个错误。。。。。。 Makefile: n n表示出问题的行数,仔细检查代码的内容,主要问题可能是该有的空格是否添加或者使用$引入的参数是否存在等 我的问题是这个 ifneq 后面的空格没有加 耐心查…

论文浅尝 | 大语言模型综述

笔记整理:刘康为、方润楠,浙江大学硕士,研究方向为自然语言处理 链接:https://arxiv.org/abs/2303.18223 一、介绍 在当前机遇和挑战的背景下,对大语言模型的研究和开发需要更多的关注。为了让读者对大语言模型有一个基…