轻量化网络——MobileNet

news/发布时间2024/5/7 10:37:58

原文链接:https://zhuanlan.zhihu.com/p/402766063

作为轻量化网络的经典网络,MobileNet自诞生就被广泛应用于工业界。笔者也经常在结构设计中使用MobileNet的诸多设计思想。本文参考众多大神文章,较详细介绍MobileNet系列的设计及改进思想,力求温故知新,举一反三。

MobileNet V1

MobileNet V1是由google2016年提出,2017年发布的文章。其主要创新点在于深度可分离卷积,而整个网络实际上也是深度可分离模块的堆叠。

在介绍深度可分离之前,先从模型推理时间的角度分析下模型结构对与模型耗时的影响。

 该图是AlexNet网络中不同层的GPU和CPU的时间消耗,我们可以清晰的看到,不管是在GPU还是在CPU运行,最重要的“耗时杀手”就是conv,卷积层。也就是说,想要提高网络的运行速度,就得到提高卷积层的计算效率。

深度可分离卷积

深度可分离卷积被证明是轻量化网络的有效设计,如上图所示,深度可分离卷积由逐深度卷积(Depthwise)和逐点卷积(Pointwise)构成。

对比于标准卷积,逐深度卷积将卷积核拆分成为单通道形式,在不改变输入特征图像的深度的情况下,对每一通道进行卷积操作,这样就得到了和输入特征图通道数一致的输出特征图。

逐点卷积就是1×1卷积。主要作用就是对特征图进行升维和降维。

标准卷积与深度可分离卷积详细对比:

 

 了解了MobileNet V1的基本结构,那么MobileNet V1为什么会快呢?

 

ReLU6就是普通的ReLU但是限制最大输出值为6(对输出值做clip),这是为了在移动端设备float16的低精度的时候,也能有很好的数值分辨率,如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16无法很好地精确描述如此大范围的数值,带来精度损失。

MobileNet1.0 由于是2016年就提出,其结构其实非常简单, 论文里头是一个非常复古的直筒结构, 类似于VGG一样。

MobileNet V2

以上介绍了MobileNet V1,那么MobileNet V1是否有缺点呢?答案是肯定的。

  • 结构问题:

V1结构过于简单,没有复用图像特征,即没有concat/eltwise+ 等操作进行特征融合,而后续的一系列的ResNet, DenseNet等结构已经证明复用图像特征的有效性。

逐深度卷积问题:
在处理低维数据(比如逐深度的卷积)时,relu函数会造成信息的丢失。
DW 卷积由于本身的计算特性决定它自己没有改变通道数的能力,上一层给它多少通道,它就只能输出多少通道。所以如果上一层给的通道数本身很少的话,DW 也只能很委屈的在低维空间提特征,因此效果不够好。
原论文作者用了大量篇幅说明以上结论1,在此我们简单理解下(因为笔者只能”简单理解“,不得已为之)。

 

上图input为2维空间的一组m个点构成的螺旋线数据​,利用随机矩阵T映射到n维空间上并进行ReLU运算,即:

再利用随机矩阵T的逆矩阵T-1,将y映射回2维空间当中:

上图的整个过程就是对一个n维空间中的一个“数据”做ReLU运算,然后(利用T的逆矩阵T-1恢复)对比ReLU之后的结果与Input的结果相差有多大。由上图可知:

当n = 2,3时,与Input相比有很大一部分的信息已经丢失了。而当n = 15到30,还是有相当多的地方被保留了下来。

也就是说,对低维度做ReLU运算,很容易造成信息的丢失。而在高维度进行ReLU运算的话,信息的丢失则会很少。

 

V2使用了跟V1类似的深度可分离结构,不同之处也正对应着V1中逐深度卷积的缺点改进:

V2 去掉了第二个 PW 的激活函数改为线性激活。
论文作者称其为 Linear Bottleneck。原因如上所述是因为作者认为激活函数在高维空间能够有效的增加非线性,而在低维空间时则会破坏特征,不如线性的效果好。
V2 在 DW 卷积之前新加了一个 PW 卷积。
给每个 DW 之前都配备了一个 PW,专门用来升维,定义升维系数
,这样不管输入通道数
是多是少,经过第一个 PW 升维之后,DW 都是在相对的更高维 (
) 进行更好的特征提取。
Inverted residuals

 Mobilenet v2中有两种深度可分离模块,步长为1时输入输出size相等,此时使用shortcut结构。步长为2时,由于input与outputsize不符,不添加shortcut结构。

总结
MobileNetV1 模型引入的深度可分离卷积(depthwise separable convolutions);

MobileNetV2 模型引入的具有线性瓶颈的倒残差结构(the inverted residual with linear bottleneck);

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

PDF文件预览

在el-table组件的el-table-column中,对应“标题”列使用<template>标签自定义内容,并在其中包裹这一个div元素,设置@click事件绑定到handleClick方法。

Layerscape LS1043AXN7QQB、LS1043AXN8QQA四核64位ARM处理器,ACFJ-3439T-000E(17A)栅极驱动光耦合器

Layerscape LS1043AXN7QQB、LS1043AXN8QQA四核64位ARM处理器,ACFJ-3439T-000E(17A)栅极驱动光耦合器一、Layerscape 1043A处理器简介: LS1043A处理器是一款面向嵌入式网络的四核64位Arm处理器。LS1043A 可通过支持无风扇设计的灵活I/O封装,提供超过10 Gbps的性能。这款SoC是…

Avalonia下拉可搜索树(TreeComboBox)

1.需求分析树形下拉的功能是ComboBox和TreeView的功能结合起来,再结合数据模板来实现这一功能。 2.代码实现1.创建UserControl集成TreeView控件 ` public class TreeComboBox : TreeView { private bool _isPushTextChangedEvent = true; private Button ClearButton; private…

void usart_dma_init(void)

void usart_dma_init(void) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;DMA_InitTypeDef DMA_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;/* 配置GPIO的模式和IO口 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_…

k8s-调度-taint

NoSchedule :表示k8s将不会将Pod调度到具有该污点的Node上 PreferNoSchedule :表示k8s将尽量避免将Pod调度到具有该污点的Node上 NoExecute :表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去去除污点 kubectl taint nodes k8s-node2 chec…