【深度学习】总目录

MobileNet V1:《MobileNets: Efficient Convolutional Neural Networks for MobileVision Applications

MobileNet V2:《MobileNetV2: Inverted Residuals and Linear Bottlenecks

MobileNet V3:《Searching for MobileNetV3

1 MobileNet V1

Motivation

  自从2012年,AlexNet在ImageNet大赛上以远超第二名的成绩夺冠,卷积神经网络在计算机视觉中变得无处不在。为了实现更高的精度,网络越来越深越来越复杂。然而,这些提高准确性的进步并不一定会使网络在大小和速度方面更加高效。在机器人、自动驾驶汽车和增强现实等许多现实世界应用中,识别任务需要在计算有限的平台上及时执行。因此需要构建非常小、低延迟的模型,该模型可以轻松地与移动和嵌入式视觉应用的设计要求相匹配。

亮点:Depthwise Separable Convolution 深度可分离卷积

  可分离卷积主要有两种类型:空间可分离卷积深度可分离卷积。空间可分离就是将一个大的卷积核变成两个小的卷积核,比如将一个3×3的核分成一个3×1和一个1×3的核;而深度可分离卷积(depthwise separable convolution)将普通卷积拆分成为一个深度卷积和一个逐点卷积。

标准卷积

  • 卷积核参数量:DK×DK×M×N
  • 计算量(只计算乘法):DK×DK×M×N×DF×DF

深度可分离卷积

深度可分离卷积分为两部分:Depthwise卷积和Pointwise卷积。

  • Depthwise卷积对每个输入通道单独使用一个卷积核处理,计算量:DK×DK×M×DF×DF
  • Pointwise卷积的卷积核尺寸为1 × 1,用于将depthwise卷积的输出组合起来,计算量:1×1×M×N×DF×DF
  • 总计算量:(DK×DK+N)×M×DF×DF

标准卷积与深度可分离卷积的比较

通常MobileNet会使用卷积核为3 × 3的深度可分离卷积,上面这个式子的结果就接近于1/9,大约可以比普通卷积减少了8到9倍的计算量

实验可以看出使用深度可分离卷积与标准卷积,参数和计算量能下降为后者的九分之一到八分之一左右,但是准确率只有下降极小的1%

DW卷积的代码实现

3x3 Depthwise Conv —> BN —> ReLU —> 1x1 Conv —> BN —> ReLU

class Block(nn.Module):
'''Depthwise conv + Pointwise conv'''
def __init__(self,input_channels,output_channels,stride=1):
super(Block,self).__init__()
self.conv1 = nn.Conv2d\
(input_channels,input_channels,kernel_size=3,stride=stride,
padding=1,groups=input_channels,bias=False)
self.bn1 = nn.BatchNorm2d(input_channels)
self.conv2=nn.Conv2d(input_channels,output_channels,kernel_size=1,
stride=1,padding=0,bias=False)
self.bn2=nn.BatchNorm2d(output_channels)
def forward(self,x):
x = F.relu(self.bn1(self.conv1(x)))
x = F.relu(self.bn2(self.conv2(x)))
return x

Depthwise conv不改变通道数,因此outout_channels = input_channels。相当于对卷积的通道数进行分组,然后对每组的特征图分别进行卷积,是组卷积(group convolution)的一种扩展,每组只有一个特征图。

2 MobileNet V2

MobileNet v2网络是由google团队在2018年提出的,相比MobileNet V1网络,准确率更高,模型更小。

MobieNet V2的Top1准确率为72.0,相对于MobieNet V1准确率为70.6,准确率提升了。同时,参数、运算量和运算时间都明显比MobieNet V1更加优秀。在cpu上MobieNet V2 运算时间只有75ms,基本上可以实现在移动设备上实时推理效果。当卷积核倍率因子为1.4时,MobieNet V2 TOP1准确率达到74.7,比论文中其他网络的准确率高。

亮点1: Linear Bottlenecks 线性瓶颈

假设2维空间有一组由n个点组成的螺旋线数据,经过随机矩阵T映射到m维,并进行ReLU运算,再通过T的逆矩阵将m维矩阵映射回2维空间。从下图可以看出,当映射维度dim=2,3时,数据坍塌;当dim>15时,数据基本被保存。虽然这不是严格的数学证明,但是至少说明:channel少的feature map不应后接ReLU,否则会破坏feature map。

发现当维度n很小的时候,后面接ReLU非线性变换的话会导致很多信息的丢失。为了减少信息丢失,本文提出了linear bottleneck,就是在bottlenck(瓶颈层,也就是1 × 1卷积)的最后输出不接非线性激活层,只做linear操作,如下图所示。

右图和左图在堆叠的时候是等效的,(线性激活后)pw升维-relu6-dw-relu6-pw降维-线性激活。

亮点2: Inverted residuals 反向残差

Inverted residuals借鉴resnet,都采用1x1卷积→3x3卷积→1x1卷积的模式,同时输入输出shortcut连接。不同的是,mobilenet的3x3卷积是dw卷积,且进入block后会先将特征维数放大,然后再压缩回去,呈现梭子的外形,而传统残差设计是沙漏形。

如下图所示,经过1x1卷积后,维度是之前的t倍。1x1卷积和dw卷积后都接relu,最后的1x1降维时,接线性变换。

bottleneck代码实现

class Bottleneck(nn.Module):
def __init__(self,input_channels,output_channels,stride=1,expansion_ratio=1):
super(Bottleneck,self).__init__()
self.stride = stride
temp_channels = input_channels*expansion_ratio
self.conv1 = nn.Conv2d(input_channels,temp_channels,kernel_size=1,bias=False)
self.bn1 = nn.BatchNorm2d(temp_channels)
self.conv2 = nn.Conv2d(temp_channels,temp_channels,padding=1,groups=temp_channels,kernel_size=3,stride=stride,bias=False)
self.conv3 = nn.Conv2d(temp_channels,output_channels,kernel_size=1,bias=False)
self.bn2 = nn.BatchNorm2d(output_channels)
if(stride==1 and input_channels!=output_channels):
self.shortcut = nn.Conv2d(in_channels=input_channels,out_channels=output_channels,kernel_size=1)
if(stride==1 and input_channels==output_channels):
self.shortcut = nn.Sequential()
def forward(self,x):
output = F.relu(self.bn1(self.conv1(x)))
output = F.relu(self.bn1(self.conv2(output)))
output = self.bn2(self.conv3(output))
if(self.stride==1):
output = output+self.shortcut(x)
return output

Tips:

1. 在stride=2时,不需要将输入与输出shortcut

2. 输入和输出的维数不同,无法直接相加,可以用1×1卷积改变输入通道的维数。(在resnet中比较过三种短接方法)

3. 上面每一个卷积后都要加BN层(BN层添加在激活函数前,对输入激活函数的输入进行归一化。这样解决了输入数据发生偏移和增大的影响。

4. 关于nn.Conv2d的bias参数是false还是true?(卷积之后,如果要接BN操作,最好是不设置偏置,因为不起作用,而且占显卡内存。

3 MobileNet V3

MobileNetV3 参数是由NAS(network architecture search)搜索获取的,又继承的V1和V2的一些实用成果,并引人SE通道注意力机制,可谓集大成者。

  • 可以看出V3版本的Large 1.0(V3-Large 1.0)的Top-1是75.2,对于V2 1.0 它的Top-1是72,相当于提升了3.2%
  • 在推理速度方面也有一定的提升,(V3-Large 1.0)在P-1手机上推理时间为51ms,而V2是64ms,很明显V3比V2,不仅准确率更高了,而且速度更快了
  • V3-Small版本的Top-1是 67.4,而V2 0.35 (0.35表示卷积核的倍率因子)的Top-1只有60.8,准确率提升了6.6%

亮点1:加入SE模块

常用的注意力机制模块(SE、CBAM)SE模块通过显式地建模通道之间的相互依赖关系,自适应地重新校准通道式的特征响应。具体来说,就是通过学习的方式来自动获取每个通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。因为SE结构会消耗一定的时间,所以作者在含有SE的结构中,将expansion layer的channel变为原来的1/4,这样既提高了精度,同时还没有增加时间消耗。

亮点2:重新设计激活函数

在 MobileNetV2 都是使用 ReLU6 激活函数。现在比较常用的是 swish 激活函数,即 x 乘上 sigmoid 激活函数。使用 swish 激活函数确实能够提高网络的准确率,但是也有一些问题(1)计算复杂(2)对量化过程非常不友好,特别是对于移动端的设备,为了加速一般都会进行量化操作。为此,作者提出了一个叫做 h-swish 的激活函数。

  • 用ReLU6(x+3)/6替换了sigmoid:1)ReLU6可以在任何软硬件平台进行计算,2)量化的时候,它消除了由于近似sigmoid的不同实现而导致的潜在数值精度损失。3)在实践中,h-swish可以作为一个分段函数来实现,以减少内存访问的数量,从而大幅降低延迟成本。
  • 只在下半部分使用h-swish:随着我们深入网络,应用非线性的成本会降低,因为每层激活内存通常在分辨率下降时减半。我们发现swish的大部分好处都是通过在更深层次上使用它们来实现的。因此,在我们的架构中,我们只在下半部分使用h-swish。

亮点3:重新设计耗时层结构

(1)第一层卷积层,用了32个3x3的卷积核来做最初的边缘检测。我们改为用16个,并且用hard swish的非线性层。作者通过实验发现,这样做其实准确率并没有改变,但是参数量小了,节省大概 2ms的时间

(2)V2最后用了1x1的卷积来增加维度(320->1280),为了拥有更多的特征,但是会导致额外的延迟。将其放在avg pooling的后面,首先利用avg pooling将特征图大小由7x7降到了1x1,然后再利用1x1提高维度,这样就减少了7x7=49倍的计算量。删掉3x3以及1x1后,精度并没有得到损失,但是速度快了很多,节省了 7ms 的推理时间,7ms占据了全部推理时间的 11%。

MobileNetV3 Definitions

MobileNetV3被定义为两种型号:MobileNetV3-large和MobileNetV3-small,分别针对高资源和低资源用例。这些模型是通过应用支持平台的NAS和NetAdapt进行网络搜索并结合本节中定义的网络改进而创建的。

参考

1. 论文笔记:MobileNet v1

2.『高性能模型』轻量级网络MobileNet_v2

3. 轻量级模型:MobileNet V2

5. MobileNetv3网络详解

6. MobileNetV3 网络结构

7. MobileNet 详解深度可分离卷积,它真的又好又快吗?

【论文笔记】轻量级网络MobileNet的更多相关文章

  1. SqueezeNet/SqueezeNext简述 | 轻量级网络

    SqueezeNet系列是比较早期且经典的轻量级网络,SqueezeNet使用Fire模块进行参数压缩,而SqueezeNext则在此基础上加入分离卷积进行改进.虽然SqueezeNet系列不如Mob ...

  2. 卷积神经网络学习笔记——轻量化网络MobileNet系列(V1,V2,V3)

    完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和Mo ...

  3. 图像分类丨浅析轻量级网络「SqueezeNet、MobileNet、ShuffleNet」

    前言 深度卷积网络除了准确度,计算复杂度也是考虑的重要指标.本文列出了近年主流的轻量级网络,简单地阐述了它们的思想.由于本人水平有限,对这部分的理解还不够深入,还需要继续学习和完善. 最后我参考部分列 ...

  4. 【论文笔记】FCN全卷积网络

    全卷积网络(FCN)是用于图片语义分割的一种卷积神经网络(CNN),由Jonathan Long,Evan Shelhamer 和Trevor Darrell提出,由此开启了深度学习在语义分割中的应用 ...

  5. 论文笔记-IGCV3:Interleaved Low-Rank Group Convolutions for Efficient Deep Neural Networks

    论文笔记-IGCV3:Interleaved Low-Rank Group Convolutions for Efficient Deep Neural Networks 2018年07月11日 14 ...

  6. ShuffleNetV1/V2简述 | 轻量级网络

    ShuffleNet系列是轻量级网络中很重要的一个系列,ShuffleNetV1提出了channel shuffle操作,使得网络可以尽情地使用分组卷积来加速,而ShuffleNetV2则推倒V1的大 ...

  7. MobileNetV1/V2/V3简述 | 轻量级网络

    MobileNet系列很重要的轻量级网络家族,出自谷歌,MobileNetV1使用深度可分离卷积来构建轻量级网络,MobileNetV2提出创新的inverted residual with line ...

  8. ESPNet/ESPNetV2:空洞卷积金字塔 | 轻量级网络

    ESPNet系列的核心在于空洞卷积金字塔,每层具有不同的dilation rate,在参数量不增加的情况下,能够融合多尺度特征,相对于深度可分离卷积,深度可分离空洞卷积金字塔性价比更高.另外,HFF的 ...

  9. 论文笔记:CNN经典结构2(WideResNet,FractalNet,DenseNet,ResNeXt,DPN,SENet)

    前言 在论文笔记:CNN经典结构1中主要讲了2012-2015年的一些经典CNN结构.本文主要讲解2016-2017年的一些经典CNN结构. CIFAR和SVHN上,DenseNet-BC优于ResN ...

  10. 论文笔记:CNN经典结构1(AlexNet,ZFNet,OverFeat,VGG,GoogleNet,ResNet)

    前言 本文主要介绍2012-2015年的一些经典CNN结构,从AlexNet,ZFNet,OverFeat到VGG,GoogleNetv1-v4,ResNetv1-v2. 在论文笔记:CNN经典结构2 ...

随机推荐

  1. leetcode - 子数组最大平均值

    给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例: 输入:[1,12,-5,-6,50,3], k = 4 输出:12.75 解释:最大平均数 (12-5-6+5 ...

  2. PeLK:101 x 101 的超大卷积网络,同参数量下反超 ViT | CVPR 2024

    最近,有一些大型内核卷积网络的研究,但考虑到卷积的平方复杂度,扩大内核会带来大量的参数,继而引发严重的优化问题.受人类视觉的启发,论文提出了外围卷积,通过参数共享将卷积的复杂性从 \(O(K^{2}) ...

  3. Serverless 在阿里云函数计算中的实践

    简介: 近日,阿里云 aPaaS&Serverless 前端技术专家袁坤在 CSDN 云原生 meetup 长沙站分享了 Serverless 在阿里云函数计算 FC 的实践. 作者:CSDN ...

  4. 云原生应用实现规范 - 初识 Operator

    简介: 本文我们将首先了解到 Operator 是什么,之后逐步了解到 Operator 的生态建设,Operator 的关键组件及其基本的工作原理,下面让我们来一探究竟吧. 作者 | 匡大虎.阚俊宝 ...

  5. WPF 解决 ObservableCollection 提示 Cannot change ObservableCollection during a CollectionChanged event 异常

    本文告诉大家在使用 ObservableCollection 时,抛出 InvalidOperationException 异常,提示 Cannot change ObservableCollecti ...

  6. async 与 promise 的区别

    async函数会引式返回一个promise,而promise的resolve值就是函数return的值 使用async和await明显节约了不少代码,不需要.then,不需要写匿名函数处理promis ...

  7. 生成带重复的笛卡尔乘积过程 Cartesian Product with Repetition

    目录 What is Cartesian Product with Repetition Code Demo What is Cartesian Product with Repetition 比如说 ...

  8. 羽夏闲谈—— Kdenlive flatpak 版本解决语音识别找不到 pip3

    简述   Kdenlive是在 Linux 上一款比较优秀的剪辑软件,功能比较强大.操作相对容易,能够满足日常剪辑的需要. 解决方案   找到对应的安装目录/var/lib/flatpak/app/o ...

  9. 「IT运维迷宫」那些让人头疼的常见问题与破局之道

    在数字化浪潮汹涌的今天,IT运维如同一座错综复杂的迷宫,稍有不慎便可能迷失方向.作为企业运营的幕后英雄,运维团队常常面临着各种突如其来的挑战.本文将带你深入探索IT运维中的那些常见"坑&qu ...

  10. 11.IO 流

    1.IO 流引入 概述:以应用程序为参照物,读取数据为输入流(Input),写数据为输出流(Output),大量输入输出数据简称 IO 流 原理: 2.IO 流的分类 读写的文件分类 二进制文件:打开 ...