轻量级网络:mobilnetv1,mobilnetv1,shufflenet v1,shufflenet v2笔记

轻量级网络

本文大纲

  • squeezenet: 还没写…
  • mobilenet v1:《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》
  • mobilenet v2:《MobileNetV2: Inverted Residuals and Linear Bottlenecks》
  • mobilenet v3: 还没看…
  • shufflenet v1:《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》
  • shufflenet v2:《ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design》

一、mobilenet v1

1.核心贡献:

  • 提出用深度可分离卷积代替传统卷积方式降低网络参数并提高运算速度;
  • 利用深度可分离卷积和两个超参数构建一个参数少又快速的轻量级网络结构,可以满足移动和嵌入式视觉应用的设计要求。

2.深度可分离卷积

[外链图片转存失败(img-ixnsitFJ-1569143071268)(_v_images/20190920222540924_28260.png)]

  • 标准卷积定义:
    对所有的输入channel进行计算得到一个新的channel。图a

  • 深度可分离卷积定义:
    将标准卷积分解成深度卷积和一个逐点卷积(1 * 1 卷积),深度卷积负责对单个输入channel用单个卷积核进行计算,逐点卷积负责1x1的卷积来结合所有深度卷积得到的输出,这种分解能够有效的大量减少计算量以及模型的大小。图b和图c

  • 传统卷积计算方式:
    传统的卷积使用的是和输入channel相同的卷积核,每次计算和所有输入channel卷积后求和得出一个数作为结果,计算量为M×Dk×DkM×Dk×Dk
    其中MM为输入的通道数,DkDk为卷积核的宽和高
    一个卷积核在padding情况下对输入数据的计算量为: Dk×Dk×M×DF×DFDk×Dk×M×DF×DF ,DFDF为输入的宽和高
    但是一般我们希望下一层输出NN个channel,就需要使用N个卷积核,所以一层的计算量为:Dk×Dk×N×M×DF×DFDk×Dk×N×M×DF×DF

  • 深度可分离卷积计算方式:
    
    • depth-wise conv计算量?
      depth-wise:每个卷积核的channel为1,只和一个输入channel做卷积计算,计算量为DkDkDFDFDk* Dk * DF * DF,输入和输出的channel都是MM,所以计算量是Dk×Dk×M×DF×DFDk×Dk×M×DF×DF

    • point-wise conv计算量?
      point-wise:使用1* 1卷积核来处理之前depth-wise输出的特征图,将输出通道数变为一个NN,计算量为N×M×DF×DFN×M×DF×DF

    • 深度可分离卷积计算量?
      depth-wise+point-wise总计算量为:Dk×Dk×M×DF×DF+N×M×DF×DFDk×Dk×M×DF×DF+N×M×DF×DF
      深度可分离卷积和传统卷积计算量比值:Dk×Dk×M×DF×DF+N×M×DF×DFDk×Dk×N×M×DF×DF=1N+1DkDk\frac{Dk×Dk×M×DF×DF+N×M×DF×DF}{Dk×Dk×N×M×DF×DF} = \frac{1}{N} + \frac{1}{Dk*Dk}

  • 例子:

如果是64*64*32的输入,希望用3*3的卷积核(其实是3*3*64*128,每个卷积核64channel,一共128个)得到64*64*128的输出,
channel从32变成了128,这里得到一个新channel就需要对输入的32个channel进行计算,
总的计算是 (3*3) * (32*128) * (64*64) = 150,994,944;        
还是刚才说的例子:深度卷积每个channel之和一个卷积核计算: 32 * (64 * 64) * (3 * 3) = 1,179,648‬, 
逐点卷积: 32 * 128 (64 * 64) * (1 * 1)  = 131,072, 加起来为 1,310,720‬ 和普通卷积整整差了两个量级。    

3.mobilenet结构

  • 模块结构:
    [外链图片转存失败(img-U8HNvMBD-1569143071269)(_v_images/20190921140547597_21372.png)]
    3 * 3 depth-wise conv和 1 * 1 point-wise 后斗接了BN和RELU。
  • 网络结构
    [外链图片转存失败(img-LWiHIGRk-1569143071269)(_v_images/20190921143441562_23504.png)]
    标准的分类网络输出size 224 * 224 * 3,5次降采样, 最后对7 * 7 * 1024做global avgpooling + FC + softmax分类。
  • 网络各个部分计算量
    [外链图片转存失败(img-JyzGDFue-1569143071269)(_v_images/20190921150032966_26329.png)]
    参数量主要几种在1 * 1 conv的地方,因为1 * 1 conv才是跨通道信息的融合,计算量需要与输入输出channel都有关,但是1 * 1 conv不需要在内存中重新排序可以直接被GEMM(最优化的数值线性代数算法)实现。可以大大优化速度。
    除了1 * 1 conv外的参数主要几种在FC层,可见卷积部分改成深度可分离卷积减少了很多计算。
  • 两个超参数 :为了能构建更小的网络,文中提出了两个超参数,一个控制channel,一个控制分辨率
    • 宽度因子α\alpha
      控制输入和输出的channel,即输入channel从MM变为αM\alpha M, 输出channel从NN变为αN\alpha N;
      α(0,1]\alpha∈(0,1],通常设置为1,0.75,0.5和0.25
    • 分辨率因子ρ\rho
      控制输入图像的分辨率和网络中各层分辨率;
      ρ(0,1]ρ∈(0,1],通常设置输入分辨率为224,192,160,128。

二、mobilenet v2

1.核心贡献.

  • 为什么引入残差模块?
    引入残差模块,更好的复用特征,而且梯度更容易传播;

  • 为什么这里的residual模块叫 Inverted residuals?
    残差模块改为对channel先升维在降维(resnet里是先降维再升维),因为depth-wise conv本来维度就低,这样防止信息丢失;
    resnet是高维输入-转化低维-恢复高维,Inverted residuals是低维输入-转换高维-恢复低维所以叫Invertedde(相反的) 。

  • 为什么去掉residual模块的最后一个RELU?
    Linear bottlenecks: ReLU会对channel数低的张量造成较大的信息损耗(因为relu会把<0的激活置0,并且无法恢复), 深度可分离卷积维度本来就很低,为了避免Relu丢失太多特征,去掉residual block的eltwise sum之前的那个 1*1 conv后的Relu;

  • 为什么用RELU6,而不是RELU?
    RELU改为RELU6: 限制最高输出为 6激活函数,为了在移动端设备的float16的低精度也能使用,不限制,输出的话可以到正无穷,如果激活值特别大,转换成floap16会有很多精度损失。

2.mobilenet v2结构

  • 模块结构
    [外链图片转存失败(img-ID3Oj195-1569143071269)(_v_images/20190921220035317_22245.png)]
    【图片来自1
    mobilenet v1: 3 * 3 depthwise conv +bn + relu + 1 * 1 point-wise conv + bn + relu;
    mobilenet v2: 1 * 1 point-wise conv + bn + relu6 + 3 * 3 depthwise conv +bn + relu6 + 1 * 1 point-wise conv + bn 并且第一个1 * 1卷积升维到6倍输入channel,最后一个1 * 1卷积降维到输入channel,最后无relu;
    resnet: 1 * 1 point-wise conv + bn + relu+ 3 * 3 conv +bn + relu + 1 * 1 point-wise conv + bn + relu并且第一个1 * 1卷积降维到0.25倍输入channel,最后一个1 * 1卷积升维到输入channel,最后有relu;
  • 网络结构
    [外链图片转存失败(img-ZV73Pm5v-1569143071269)(_v_images/20190921213308155_30156.png)]
    除了模块的改进之外,一个最大的改动就是mobilenet v1最后的FC改成了卷积,所以mobilenet v2其实是一个全卷积的网络。

三、shuffleNet v1

1.核心贡献

  • 结合 group conv 和 channel shuffle 来设计卷积神经网络模型, 减少模型使用的参数数量并加速运行;

2.group conv

[外链图片转存失败(img-iYRfgYwT-1569143071270)(_v_images/20190922160137810_10868.png)]

  • 如何做 group conv 和 channel shuffle ?
    把各组的 channel 平均分为 gg份(文中设置g=3),然后按照顺序的重新构成 新的feature map;
    本文把group conv用在1 * 1卷积里,所以是point-wise group conv。
  • 计算量
    resnet模块: 1 * 1 conv + 3 * 3 conv + 1 * 1 conv, 跳跃连接求和;
    ResNeXt模块: 1 * 1 conv + 3 * 3 group conv + 1 * 1 conv, 跳跃连接求和;
    shufflenet v1模块: 1 * 1 conv + 3 * 3 depth-wise conv + 1 * 1 conv,跳跃连接求和;
    假设输入是c × h × w, bottleneck channels 是m,
    ResNet计算量为 hw(2cm+9m2)h * w * (2 * c * m+9 * m^2)
    ResNeXt计算量为 hw(2cm+9m2g)h * w*(2*c*m +\frac{9*m^2}{g})
    ShuffleNet计算量为 hw(2cm9+9m)h*w*(\frac{2*c*m}{9} +9*m)
    说明:
h*w*c是输入feature map大小,1*1 conv改变channel为m,所以计算量为h*w*c*m,
但是因为最后还原channel为n,所以是h*w*c*m*2,
因为kernelsize是3*3,且输入输出channel都是m,所以普通conv计算是h*w*3*3*m*m,
group conv计算量是h*w*3*3*m*m/g,
depthwise conv计算式h*w*3*3*m, 
ShuffleNet里的group conv操作放在了1*1,所以它的1*1卷积计算量除以g。    
  • 为什么flops评估模型速度不合理?
    有些时候即使flops小也可能计算比较慢,因为有内存消耗、GPU并行性、IO次数等等的影响因素;
    比如有时候需要多次IO或者改变数据分布(img2col)等。

  • 为什么要group conv?
    group conv其实是conv和深度可分离卷积的折中,对channel分组计算,每个输出只跟几个输入channel有关,能大大***减小计算量***,在ResNeXt中就有使用。

  • 为什么用在point-wise卷积里?
    1 * 1卷积其实也需要很大计算量(mobilenet v1中占70%多计算量),ResNeXt里有很多pointwise卷积其实影响了网络速度,但是目前都是对3 * 3改成group-wise卷积或者depthwise卷积其实不是很合理,所以本文进一步对1 * 1改进。

  • 为什么要channel shuffle?
    mobilenet v1的1 * 1卷积计算量大,是考虑所有输入channel的 计算,改成group-wise conv可以减少计算量和参数量,但是channel之前没有了信息流通,尤其是depthwise+pointswise的结构,本身depthwise就没考虑channel之间交互,pointwise改成了group又减少了channel交互,所以使用channel shuffle,将feature map 的 channel 有序打乱,构成新的 feature map,从而解决 group conv 信息不流通的问题

3.网络结构

  • 模块结构
    [外链图片转存失败(img-HLygsxgw-1569143071270)(_v_images/20190922160518603_17640.png)]
    图中b和c是shufflenet结构,b是没有改变h和w的,c是降采样2倍的结构,相比之下c结构在跳跃连接的地方多了一个kernel size3 * 3,步长为2 的平均池化
    总体就是: 1 * 1 group conv + channel shuffle + 3 * 3 depth-wise conv + 1 * 1 group conv;
  • 整体结构
    在这里插入图片描述

三、shuffleNet v2

1.核心贡献

  • flops衡量网络速度不准确,即使参数量相同,但是速度也不同,改为直接用速度来衡量;
  • 提出轻量级网络设计的4条准则:
    MAC为memory access cost(内存访问成本).
    G1: 尽可能使用输入通道和输出通道相同的卷积操作,point-wise conv 的升维降维会影响速度;
    G2: 分组越多,MAC越大;
    G3: 减少网络分支数,因为网络分支会影响GPU运算的并行化;
    G4: 减少element-wise操作;
  • 引入channel split,设计了一个更高效高精度的网络shufflenet v2;

2. channel split

[外链图片转存失败(img-ZXMY5hxI-1569143071270)(_v_images/20190922164932458_22936.png)]
c和d分别是v2的basic unit和下采样2倍的unit:
v2主要引入了channel split,分割channel为2份(满足G3,只分为2份);
右侧的分支输入和输出channel一致(满足G1);
右侧的卷积没有使用分组卷积(满足G2);
左侧和右侧合并的时候使用concat而不是element-wise sum(满足G4)
堆叠ShuffleNet v2模块时,concat,channel shuffle,channel split可以合并成1个element-wise操作(满足G4)。

3.网络结构

  • 整体结构:
    [外链图片转存失败(img-f5Pb76mU-1569143071270)(_v_images/20190922165733478_25324.png)]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章