当前位置:   article > 正文

MobileNetV1 & MobileNetV2 简介_efficient convolutional neural networks for mobile

efficient convolutional neural networks for mobile vision applications


一、模型复杂度与硬件性能的衡量

1、模型复杂度的衡量

  • 参数数量(Params):指模型含有多少参数,直接决定模型的大小,也影响推断时对内存的占用量
    • 单位通常为 M,通常参数用 float32 表示,所以模型大小是参数数量的 4 倍左右
    • 参数数量与模型大小转换示例:10M float32 bit = 10M × 4 Byte = 40MB
  • 理论计算量(FLOPs):指模型推断时需要多少计算次数
    • 是 floating point operations 的缩写(注意 s 小写),可以用来衡量算法/模型的复杂度,这关系到算法速度,大模型的单位通常为 G(GFLOPs:10亿次浮点运算),小模型单位通常为 M
    • 通常只考虑乘加操作(Multi-Adds)的数量,而且只考虑 CONV 和 FC 等参数层的计算量,忽略 BN 和 PReLU 等等。一般情况,CONV 和 FC 层也会 忽略仅纯加操作 的计算量,如 bias 偏置加和 shotcut 残差加等,目前有 BN 的卷积层可以不加 bias
    • PS:也有用 MAC(Memory Access Cost) 表示的

2、硬件性能的衡量

  • 算力:
    • 计算平台倾尽全力每秒钟所能完成的浮点运算数(计算速度,fp32),单位一般为 TFLOPS(floating point of per second
    • 计算公式一般为 处理器核心时钟频率 × 处理器核心数量 × 特定数据类型的指令吞吐量 × 2 ,后面乘以 2 是因为乘加视作两次浮点运算
    • eg:NVIDIA A100 GPU 频率为 1.41GHZ,处理器( Streaming Multiprocessors, SMs)数为 108,每个处理器 FP32 的 CUDA Cores 数量为 64,那么 PeakFLOPS = 1.41*108*64*2 = 19.49TFLOPS
  • 带宽(Bandwidth):
    • 计算平台倾尽全力每秒所能完成的内存(CPU 内存 or GPU 显存)交换量,单位一般为 GB/s(GByte/second)
    • 计算公式一般为 (内存核心时钟频率 × 2) × (内存位宽 / 8) × 通道数,内存频率乘以 2 是因为一个时钟周期传输 2 bit 数据(上升沿和下降沿各传送一次);内存位宽的单位为 bit,除以 8 转换为 Byte;现在的内存条一般通道数为 2
    • eg:某相机芯片带宽:(2000MHZ × 2) × (32 / 8) × 2 = 32GB/s ,NVIDIA A100 带宽:(1215MHZ × 2) × (5120 / 8) × 1 = 1555.2GB/s
      在这里插入图片描述
  • 吞吐量(Throughput): 传输系统在单位时间内成功传输的数据量,通常以每秒传输的数据量(比特/秒或字节/秒)来表示。吞吐量越高,表示系统在单位时间内能够实际处理的数据量越大。
  • 延迟(Latency): 指完成一个操作或任务所需的时间。它通常衡量的是单个操作的响应时间,从请求发出到接收到结果的时间间隔。延迟越低,表示系统响应更快。

3、模型复杂度的计算公式

假设卷积核大小为 K h × K w K_h \times K_w Kh×Kw,输入通道数为 C i n C_{in} Cin,输出通道数为 C o u t C_{out} Cout输出特征图的宽和高分别为 W W W H H H,这里忽略偏置项

  • CONV 标准卷积层

    • Params: K h × K w × C i n × C o u t K_h \times K_w \times C_{in} \times C_{out} Kh×Kw×Cin×Cout
    • FLOPs: K h × K w × C i n × C o u t × H × W = p a r a m s × H × W K_h \times K_w \times C_{in} \times C_{out} \times H \times W = params \times H \times W Kh×Kw×Cin×Cout×H×W=params×H×W
  • FC 全连接层(相当于 k=1)

    • Params: C i n × C o u t C_{in} \times C_{out} Cin×Cout
    • FLOPs: C i n × C o u t C_{in} \times C_{out} Cin×Cout
  • 参数量与计算量:https://github.com/Lyken17/pytorch-OpCounter


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

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

  • 深度可分离卷积的使用
    • 在进行 depthwise 卷积时只使用了一种维度为in_channels的卷积核进行特征提取(没有进行特征组合)
    • 在进行 pointwise 卷积时只使用了output_channels 种 维度为in_channels 1*1 的卷积核进行特征组合,普通卷积不同 depth 层的权重是按照 1:1:1…:1的比例进行相加的,而在这里不同 depth 层的权重是按照 不同比例(可学习的参数) 进行相加的
    • 参数数量由原来的p1 = F*F*in_channels*output_channels 变为了p2 = F*F*in_channels*1 + 1*1*in_channels*output_channels,减小为原来的p2/p1 = 1/output_channels + 1/F*F,其中 F 为卷积核的尺寸,若 F = 3 F = 3 F=3,参数量大约会减少到原来的 1 / 8 → 1 / 9 1/8 \to 1/9 1/81/9
    • Note: 原论文中对第一层没有用此卷积,深度可分离卷积中的每一个后面都跟 BN 和 RELU
      在这里插入图片描述
  • Global Average Pooling 的使用:这一层没有参数,计算量可以忽略不计
  • CONV/s2(步进2的卷积)代替 MaxPool+CONV:使得参数数量不变,计算量变为原来的 1/4 左右,且省去了MaxPool 的计算量
  • Note:采用 depth-wise convolution 会有一个问题,就是导致 信息流通不畅 ,即输出的 feature map 仅包含输入的 feature map 的一部分,在这里,MobileNet 采用了 point-wise(1*1) convolution 帮助信息在通道之间流通

2、MobileNetV1 中引入的两个超参数

  • Width Multiplier( α \alpha α): Thinner Models
    • 所有层的 通道数(channel) 乘以 α \alpha α 参数(四舍五入),模型大小近似下降到原来的 α 2 \alpha^{2} α2 倍,计算量下降到原来的 α 2 \alpha^{2} α2
    • α ∈ ( 0 , 1 ] \alpha \in (0, 1] α(0,1] with typical settings of 1, 0.75, 0.5 and 0.25,降低模型的宽度
  • Resolution Multiplier( ρ \rho ρ): Reduced Representation
    • 输入层的 分辨率(resolution) 乘以 ρ \rho ρ 参数 (四舍五入),等价于所有层的分辨率乘 ρ \rho ρ,模型大小不变,计算量下降到原来的 ρ 2 \rho^{2} ρ2
    • ρ ∈ ( 0 , 1 ] \rho \in (0, 1] ρ(0,1],降低输入图像的分辨率

3、标准卷积和深度可分离卷积的区别

这里写图片描述


4、TensorFlow 中的代码实现

  • 可使用 tensorflow 中的tf.nn.separable_conv2d() 来实现, 参数depthwise_filter中的 channel_multiplier 设为 1 即可
# 使用 slim 来实现
def _depthwise_separable_conv(inputs,
                              num_pwc_filters,
                              kernel_width,
                              phase,
                              sc,
                              padding='SAME',
                              width_multiplier=1,
                              downsample=False):
    """ Helper function to build the depth-wise separable convolution layer.
    """
    num_pwc_filters = round(num_pwc_filters * width_multiplier)
    _stride = 2 if downsample else 1

    # skip pointwise by setting num_outputs=None
    depthwise_conv = slim.separable_convolution2d(inputs,
                                                  num_outputs=None,
                                                  stride=_stride,
                                                  depth_multiplier=1,
                                                  kernel_size=[kernel_width, kernel_width],
                                                  padding=padding,
                                                  activation_fn=None,
                                                  scope=sc + '/depthwise_conv')

    bn = slim.batch_norm(depthwise_conv, activation_fn=tf.nn.relu, is_training=phase, scope=sc + '/dw_batch_norm')
    pointwise_conv = slim.convolution2d(bn,
                                        num_pwc_filters,
                                        kernel_size=[1, 1],
                                        activation_fn=None,
                                        scope=sc + '/pointwise_conv')
    bn = slim.batch_norm(pointwise_conv, activation_fn=tf.nn.relu, is_training=phase, scope=sc + '/pw_batch_norm')
    return bn
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

5、Caffe 中的代码实现

  • 海思 NNIE 中的 DepthwiseConv 层便是经过卷积优化后的,老版本的 cudnn 要在 group 下面设置 engine: CAFFE
    在这里插入图片描述

三、MobileNetV2:Inverted Residuals and Linear Bottlenecks

1、主要改进点

  • 引入残差结构,先升维再降维,增强梯度的传播,显著减少推理期间所需的内存占用(Inverted Residuals
  • 去掉 Narrow layer(low dimension or depth) 后的 ReLU,保留特征多样性,增强网络的表达能力(Linear Bottlenecks
  • 网络为全卷积的,使得模型可以适应不同尺寸的图像;使用 RELU6(最高输出为 6)激活函数,使得模型在低精度计算下具有更强的鲁棒性
  • MobileNetV2 building block 如下所示,若需要下采样,可在 DWise 时采用步长为 2 的卷积;小网络使用小的扩张系数(expansion factor),大网络使用大一点的扩张系数(expansion factor),推荐是5~10,论文中 t = 6 t = 6 t=6
    在这里插入图片描述

2、和 MobileNetV1 的区别在这里插入图片描述

3、和 ResNet 的区别

在这里插入图片描述

4、代码实现


四、参考资料

1、CVPR 2018 高效小网络探密(上)
2、CVPR 2018 高效小网络探密(下)
3、MobileNet V2 论文初读
4、https://github.com/shicai/MobileNet-Caffe

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/678129
推荐阅读
相关标签
  

闽ICP备14008679号