MobilNnet

一、参数数量和理论计算量

1、定义

  • 参数数量(params):关系到模型大小,单位通常为M,通常参数用 float32 表示,也就是每个参数占4个字节,所以模型大小是参数数量的 4 倍
  • 理论计算量(FLOPs)
    • 是 floating point operations 的缩写(注意 s 小写),可以用来衡量算法/模型的复杂度,这关系到算法速度,大模型的单位通常为 G,小模型单位通常为 M
    • 通常只考虑乘加操作(Multi-Adds)的数量,而且只考虑 CONV 和 FC 等参数层的计算量,忽略 BN 和PReLU 等等。一般情况,CONV 和 FC 层也会忽略仅纯加操作 的计算量,如 bias 偏置加和 shotcut 残差加等,目前技术有 BN 的 CNN 可以不加 bias

2、计算公式

联想矩阵运算公式。

假设卷积核大小为 K× Kw​,输入通道数为 Cin x Cout,输出特征图的宽 W 和高 H,忽略偏置。

  • CONV 标准卷积层:
    • 参数量就是kernel*kernel*channel_input*channel_output,卷积核的大小x通道数量x卷积核的个数
    • ,输入通道数等于一个卷积核的通道数,输出通道数=卷积核的个数;
    • 计算量:kernel*kernel*next_featuremap_height*next_featuremap_wight*channel_input*channel_output
    • 就是卷积核尺寸 x 输出特征图尺寸  x 卷积核通道数(输入通道数)x 输出通道数(卷积核个数) 
  •  FC 全连接层(相当于 k=1,输入输出都不是二维图像,都是单个点):
    • 参数量等于计算量,因为输入输出都不能使二维平面,而是向量
    • ,C相当于一个一张图片展成一条线上的所有点,也就是所有的像素点

参数量取决于显存大小,计算量要求芯片的floaps(gpu的运算能力)

二、MobileNetV1: Efficient Convolutional Neural Networks for Mobile Vision Applications

1、能够减少参数数量和计算量的原理

标准卷积

输入层维度:Dinput_h * Dinput_w * M(输入的长和宽 x 输入的通道数M)

转化为输出层维度:DG * DG * N

其中假设卷积核Dk * Dk,那么参数量:Dk * Dk * M * N,计算量:Dk * Dk * M * DG * DG * N

标准卷积不管当前pixel有多少channels,卷积之后就是一个channel:

深度可分离卷积

将一个标准卷积核分成一个深度卷积depthwise convolution 和一个 1x1 的卷积(点卷积)。

第一步深度卷积操作是在每个channel上做的卷及操作

参数量:Dk * Dk * 1 * M(每个卷积核通道数是1,卷积核的个数=输入图像的通道数,输入输入通道数没有变)

计算量:Dk * Dk * M * DG * D

第二部点卷积(标准卷积,卷积核1x1),将每个通道结合起来

参数量:1 * 1 * M * N

计算量:1 * 1 * DG * DG * M * N

最后和标准卷积的计算量相比:

mobileNet使用的是3x3的卷积核,所以计算量可以减少8~9倍。

depthwise精确度

并不是单纯的将标准卷积换成两种卷积的叠加,没有强行损失精度为代价来提升速度。

dw卷积不是标准卷积中的单核单通道卷积,每个通道都是不一样的卷积,而且dw卷积并没有让通道之间产生的数据进行信息交流;

pw卷积才是将dw卷积之后的feature map通道之间进行信息间的交互,同时pw卷积将特征嵌入到低维子空间,用更低通道的feature map来存储信息;

使用残差网络结构 扩张->dw卷积->降维 的结构,扩张的目的就是为了提升模型的效果。

2、神经网络结构

mobileNet网络结构图。

28层,深度卷积和点卷积分开来算。

不分开算(dw和pw为一个卷积层):14层卷积层(从0开始)+ pool + fc +(或再接一个softmax层)

之前标准的结构式卷积层后跟上BN层和Relu激活函数,使用Depthwise Separable convolution之后,每一层都跟上了BN层和relu激活函数:

 其中,原来的标准卷积修改为:

3、引入参数

(1)宽度乘数(width multiplier)

超参数α,目的是使模型变瘦:所有层的通道数都乘α,输入层M通道,变成αM;输出层N通道,变成αN。

所以引入宽度乘数后总的计算量:Dk * Dk * αM * DG * DG + * DG * DG * αM * αN 

一般α∈(0,1],常取的值是1,0.75,0.5,0.25。

大约可以减少参数量和计算量的α2

(2)分辨率乘数(resolution multiplier)

超参数ρ,目的是降低图片的分辨率:所有层的分辨率乘ρ(四舍五入),feature map长宽都乘ρ,ρDG * ρDG

模型大小不变,计算量下降到原来的 ρ2,ρ∈(0,1]。

(3)参数的选择

关于超参数的选择,下图可以看出准确度和参数量和参数运算量的关系,之间有个trade off,合理选择参数即可。

三、MobileNetV2:Inverted Residuals and Linear Bottlenecks

1、主要改进点

  • 引入残差结构(shortcut);
  • inverted residual block,在进行深度卷积之前,先进行1x1卷积增加feature map的通道数。(一般是两头多,中间少(沙漏形态),而inverted residual block是两头少,中间多(梭子形态))。增强梯度的传播,显著减少推理期间所需的内存占用;
  • 点卷积后使用linear激活函数,来防止relu对特征的破坏,保留特征多样性,增强网络的表达能力,使得模型在低精度计算下具有更强的鲁棒性;
  • 网络为全卷积的,使得模型可以适应不同尺寸的图像;

2、先1x1卷积扩充通道数

和mobileNet_v1比,计算量增加了,但相当于标准卷积来说,计算量还是相当少的。

v2在dw卷积之前新加了一个pw卷积,这么做的原因是因为dw卷积本身不能改变通道数,上一层给他多少通道,他就只能输出多少通道,所以如果上一层通道数很少的话,dw也只能委屈的在低维空间提取特征,因此效果不够好。所以v2为了改变这个问题,给每个dw之前都配了一个pw,专门用来提升维度,定义维度系数6,这样不断输入维度多少,经过这个pw升维之后,dw都是在相对的更高维进行工作。

3、线性激活函数

恒等函数(Identity)或线性激活(Linear activation)函数是最简单的激活函数。输出和输入成比例。线性激活函数的问题在于,它的导数是常数,梯度也是常数,梯度下降无法工作。

V2去掉了dw之后的pw的激活函数,改为linear,称为linear bottleneck,这么做是因为,激活函数在高维空间能够有效地增加非线性,增强特征的表达能力,但是在低维空间的话,就会破坏特征,不如线性的效果好。

由于第二个pw主要功能就是降维,所以按照上面的理论,降维之后,就不宜再用relu6了。

4、inverted residual block

V2借鉴了resnet,都采用 1x1 -> 3x3 -> 1x1 的模式,同样适用shortcut将输出与输入相加。

但是不同点是:

  1. resnet适用标准卷积来提取特征,v2适用dw卷积。
  2. resnet先降维(0.25倍)->卷积->升维,而v2是先升维(6倍)->卷积->降维。所以直观上看resnet是沙漏形态,v2是梭子形态。这种结构成为inverted residual block,这么做是为了配合dw卷积而做的适配,希望提取特征能够在高维进行。

4、relu6

relu6一般在低精度运算中使用,在移动端设备中很受欢迎。和relu相比,relu6的输出被限制在了一个固定区间内。

补充

MobileNetV2 building block 如下所示,若需要下采样,可在 DWise 时采用步长为 2 的卷积;

小网络使用小的扩张系数(expansion factor),大网络使用大一点的扩张系数(expansion factor),推荐是5~10,论文中 t=6

 

原文地址:https://www.cnblogs.com/pacino12134/p/11066649.html