mobileNet-一个典型的网络加速的例子

论文链接:https://arxiv.org/abs/1704.04861

MXNet框架代码:https://github.com/miraclewkf/mobilenet-MXNet

moblileNet,顾名思义,可以在移动端使用的网络,那必然要求网络的计算量要小一些,不然移动端可扛不住啊,那MobileNet如何做到这个的呢??总结来看,其主要创新点就在于论文中反复强调的depth-wise separable convolutions,作者将其操作分成两步,一部分是depthwise convolution,另一部分是pointwise convolution,通过这种方法,将网络的复杂度降下来,使得可以在移动端、嵌入式平台中使用。

那么MobileNet是怎么做的呢?
首先介绍一下论文的核心:Depthwise Separable Convolution

Depthwise Separable Convoltion类似于一种因式分解,比如你求面积,可以使用长乘以宽一样,moblieNet就是将一个完整的卷积分为两部分:depthwise convolution以及1*1的pointwise convolution, depthwise对特征图的每个channel进行卷积,pointwise convolution将depthwise的结果进行合并。如下图所示,图(a)为一个标准的卷积计算,标准的卷积需要将filter与各个channel相乘,然后求和得到一个卷积结果。图(b)代表着depthwise convolution,其将每个filter与每个channel单独相乘,并不求和,得到与原来channel相同的特征图,然后利用图(c)代表pointwise convolution,将各个特征图求和。

下面详细说明一下:

在标准的卷积中假设输入为 D F ∗ D F ∗ M D_F*D_F*M DFDFM的特征图F,其中M为通道数(channel),输出为 D G ∗ D G ∗ N D_G*D_G*N DGDGN的特征图G,利用卷积核大小为 M ∗ D K ∗ D K ∗ N M*D_K*D_K*N MDKDKN,标准的卷积计算的计算量为: D K ∗ D K ∗ M ∗ N ∗ D F ∗ D F D_K*D_K*M*N*D_F*D_F DKDKMNDFDF这里当然是估算,stride=1时,大概是这个数,至于moblileNet呢?首先使用M个 D K ∗ D K D_K*D_K DKDK的卷积核,如图(b)所示,对每个channel进行处理(这里其实就是一个group 卷积处理,group数量等于channel数量,就实现了每个卷积核对每个channel处理),这里的计算量是 D K ∗ D K ∗ M ∗ D F ∗ D F D_K*D_K*M*D_F*D_F DKDKMDFDF,但是这并没有将channel信息进行融合,所以作者接着使用N个1*1的卷积进行channel的合并,这里的计算量是 M ∗ N ∗ D F ∗ D F M*N*D_F*D_F MNDFDF,所以总的计算量是原来的(这里直接上图,打公式有点费劲):

这里作者介绍到,如果使用3*3的depthwise separable convolutions可以减少8-9倍的计算量,后面的表格也证明了这一点

网络block的实现如下所示,不管你用不用MXNET,代码应该可以看懂

def Conv(data, num_filter=1, kernel=(1, 1), stride=(1, 1), pad=(0, 0), num_group=1, name='', suffix=''):
    conv = mx.sym.Convolution(data=data, num_filter=num_filter, kernel=kernel, num_group=num_group, stride=stride, pad=pad, no_bias=True, name='%s%s_conv2d' % (name, suffix))
    bn = mx.sym.BatchNorm(data=conv, name='%s%s_batchnorm' % (name, suffix), fix_gamma=True)
    act = mx.sym.Activation(data=bn, act_type='relu', name='%s%s_relu' % (name, suffix))
    return act


def Conv_DPW(data, depth=1, stride=(1, 1), name='', idx=0, suffix=''):
    conv_dw = Conv(data, num_group=depth, num_filter=depth, kernel=(3, 3), pad=(1, 1), stride=stride, name="conv_%d_dw" % (idx), suffix=suffix)
    conv = Conv(conv_dw, num_filter=depth * stride[0], kernel=(1, 1), pad=(0, 0), stride=(1, 1), name="conv_%d" % (idx), suffix=suffix)
    return conv
Network Structure

MobileNet的结构如下图(共28层):

MobileNet中的所有层都接了BN层以及ReLU层,下采样层,采用depthwise convolution中的stride进行,最后接了全局平均池化层

作者还提到了一点是:非结构化的稀疏矩阵,并不一定比密集矩阵快,除非是高程度的稀疏

下图中介绍了采用这个方法各个层的参数占比:

进一步减少参数的手段(一):Width Multiplier: Thinner Models

虽然到这里,参数已经降低很多了,但是作者并不满足,而是想办法继续降低参数量,怎么做的呢?作者引入了一个参数 α \alpha α,被称作宽度乘子,作用呢就是降低网络的宽度,同时将网络每层的输入与输出降低到原来的 α \alpha α倍, α \alpha α一般被设置为1,0.75,0.5,0.25

D K ∗ D K ∗ α M ∗ D F ∗ D F + α M ∗ N ∗ D F ∗ D F D_K*D_K*\alpha M*D_F*D_F + \alpha M*N*D_F*D_F DKDKαMDFDF+αMNDFDF

进一步减少参数的手段(二):Resolution Multiplier: Reduced Representation

该方法通过按照比例降低输入图像以及每层的特征图大小来减少参数量,同样比较直观,公式如下:

D K ∗ D K ∗ α M ∗ ρ D F ∗ ρ D F + α M ∗ N ∗ ρ D F ∗ ρ D F D_K*D_K*\alpha M*\rho D_F*\rho D_F + \alpha M*N*\rho D_F*\rho D_F DKDKαMρDFρDF+αMNρDFρDF

论文主打就是降低网络的计算量,那么该方法究竟可以降低多少计算量呢?看下面一张表格,这是一个layer的例子,只是用depthwise separable conv降低了约9倍的计算量,如果再加上上面的那两个手段,降低了30来倍呀

做了这么多,参数降低了这么多,那么网络的精度会怎么样呢?这里是作者的实验结果:

首先在imagenet上面的实验,上面是全卷积网络,下面是mobileNet网络,可见,参数量降低了大约9倍,但是精度只是减少了约1%。:

接下来就是作者的一顿穷举,各个参数,各个数据集,对比网络的参数量以及精度,这里就不详细介绍了,想了解的读者可以查看论文。

这里介绍一个在COCO数据集上进行检测的实验结果:

------很久之后再看的反思(学而时习之,真的很重要)-----
其实这篇论文,核心思想就是要减少计算量,那么怎么减少呢?

  • 通过分组卷积来减少计算量(并增加了point-wise来进行channel之间的交互)
  • 通过分组卷积(depth-wise),可以将计算量减少8-9倍,这时候1x1的卷积计算量就凸显出来了。
  • 从channel的角度继续减少计算量:引入了一个参数 α \alpha α,控制channel的数量,进一步减少计算量。
  • 从特征图大小的角度减少计算量:引入一个参数 β \beta β,对特征图比例进行缩放控制。

下面从计算量公式上进行理解,如下:

原本计算量: D K ∗ D K ∗ M ∗ N ∗ D F ∗ D F D_K*D_K* M*N*D_F*D_F DKDKMNDFDF
分组卷积后: D K ∗ D K ∗ M ∗ D F ∗ D F + M ∗ N ∗ D F ∗ D F D_K*D_K* M*D_F*D_F + M*N*D_F*D_F DKDKMDFDF+MNDFDF
上面公式中 D K D_K DK已经是3x3的了不能动了,N是输入channel不能动了,那想继续降低参数只能在M和 D F D_F DF上下功夫了,所以:
在M上下功夫,减少channel: D K ∗ D K ∗ α M ∗ D F ∗ D F + α M ∗ N ∗ D F ∗ D F D_K*D_K*\alpha M*D_F*D_F + \alpha M*N*D_F*D_F DKDKαMDFDF+αMNDFDF
进一步在 D F D_F DF上下功夫: D K ∗ D K ∗ α M ∗ ρ D F ∗ ρ D F + α M ∗ N ∗ ρ D F ∗ ρ D F D_K*D_K*\alpha M*\rho D_F*\rho D_F + \alpha M*N*\rho D_F*\rho D_F DKDKαMρDFρDF+αMNρDFρDF

仅此而已

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Mobilenet-V3 is a convolutional neural network architecture that is designed for efficient mobile and embedded vision applications. It is an extension of the Mobilenet-V2 architecture, with improvements in terms of accuracy, efficiency, and flexibility. To use Mobilenet-V3 in TensorFlow, you can either build the network from scratch or utilize pre-trained models provided by TensorFlow. The pre-trained models are available in different sizes and variations, such as small, large, and search-space options. To get started with Mobilenet-V3 in TensorFlow, you can follow these steps: 1. Install TensorFlow: Make sure you have TensorFlow installed on your system. You can use pip to install it: `pip install tensorflow`. 2. Load the Mobilenet-V3 model: If you want to use a pre-trained model, you can use the `tf.keras.applications` module to load it. For example, to load the small variant of Mobilenet-V3, you can use: ```python import tensorflow as tf model = tf.keras.applications.MobileNetV3Small() ``` 3. Preprocess your input data: Before feeding your data into the network, you may need to preprocess it according to the requirements of Mobilenet-V3. This typically involves resizing the images and normalizing the pixel values. 4. Run inference: Once you have loaded the model and preprocessed your data, you can run inference to obtain predictions. Pass your input data through the model and interpret the output based on your task (e.g., classification, object detection, etc.). Note that this is just a brief overview of how to use Mobilenet-V3 in TensorFlow. Depending on your specific requirements and use case, you may need to customize the architecture or fine-tune the pre-trained models. It's recommended to consult the TensorFlow documentation and resources for more detailed instructions and examples.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值