是Google针对手机等嵌入式设备( 移动和嵌入式视觉应用 mobile and embedded vision applications)
提出的一种轻量级的深层神经网络,取名为MobileNets。
个人感觉论文所做工作偏向于模型压缩方面,
核心思想就是卷积核的巧妙分解,可以有效减少网络参数。
MobileNets是基于一个流线型的架构 streamlined architecture
轻量级的深层神经网络 light weight deep neural networks.
一些嵌入式平台上的应用比如机器人和自动驾驶,它们的硬件资源有限,
就十分需要一种轻量级、低延迟(同时精度尚可接受)的网络模型
在建立小型和有效的神经网络上,已经有了一些工作,比如SqueezeNet,Google Inception,Flattened network等等。
大概分为压缩预训练模型和直接训练小型网络两种。
MobileNets主要关注优化延迟,同时兼顾模型大小,不像有些模型虽然参数少,但是也慢的可以。
(1)卷积核分解,使用1×N和N×1的卷积核代替N×N的卷积核
(2)使用bottleneck结构,以SqueezeNet为代表
(3)以低精度浮点数保存,例如Deep Compression
(4)冗余卷积核剪枝及哈弗曼编码
将标准卷积分解成一个深度卷积和一个点卷积(1 × 1卷积核)。深度卷积将每个卷积核应用到每一个通道,
而1 × 1卷积用来组合通道卷积的输出。后文证明,这种分解可以有效减少计算量,降低模型大小
3 × 3 × 3 ×16 3*3的卷积 3通道输入 16通道输出
===== 3 × 3 × 1 × 3的深度卷积(3个3*3的卷积核,每一个卷积核对输入通道分别卷积后叠加输出) 输出3通道 1d卷积
===== + 1 × 1 × 3 ×16的1 ×1点卷积 1*1卷积核 3通道输入 16通道输出
参数数量 75/432 = 0.17
3*3*输入通道*输出通道 -> BN -> RELU
=======>
3*3*1*输入通道 -> BN -> RELU -> 1*1*输入通道*输出通道 -> BN -> RELU
为了构建更小和更少计算量的网络,作者引入了宽度乘数 ,
作用是改变输入输出通道数,减少特征图数量,让网络变瘦。
分辨率乘数用来改变输入数据层的分辨率,同样也能减少参数。
"""
1. 普通3d卷积层 3*3*3*round(32 * width_multiplier) 3*3卷积核 3通道输入 输出通道数量 随机确定1~32个
2. 13个 depthwise_separable_conv2d 层 3*3*1*输入通道 -> BN -> RELU -> 1*1*输入通道*输出通道 -> BN -> RELU
3. 均值池化层 7*7核 + squeeze 去掉维度为1的维
4. 全连接层 输出 -> [N, 1000]
5. softmax分类输出到 0~1之间
"""
f(x) + W*x
f(x) 为 2个 3x3的卷积
实际中,考虑计算的成本,对残差块做了计算C,即将2个3x3的卷积层替换为 1x1 + 3x3 + 1x1 。
新结构中的中间3x3的卷积层首先在一个降维1x1卷积层下减少了计算,然后在另一个1x1的卷积层下做了还原,既保持了精度又减少了计算量。
_____________________________________>
| + f(x) + x
x-----> 1x1 + 3x3标准 + 1x1 卷积 ----->
压缩”→“卷积提特征”→“扩张”
DW 逐通道卷积 每个卷积核之和一个通道卷积 k*k*1 卷积核数量为 输入通道数量
之后使用 1*1的普通卷积(点卷积) 合并个通道特征
在v1 的 Depth-wise convolution之前多了一个1*1的“扩张”层,目的是为了提升通道数,获得更多特征;
最后不采用Relu,而是Linear,目的是防止Relu破坏特征。
结合 x (中间3x3DW 步长为1结合x 步长为2时不结合x )
1. 步长为1结合x shortcut
___________________________________>
| --> f(x) + x
x-----> 1x1 + 3x3DW + 1x1 卷积 ----->
“扩张”→“卷积提特征”→ “压缩”
ResNet是:压缩”→“卷积提特征”→“扩张”,MobileNetV2则是Inverted residuals,即:“扩张”→“卷积提特征”→ “压缩”
2. 步长为2时不结合x
x-----> 1x1 + 3x3DW(步长为2) + 1x1 卷积 -----> 输出
1. 2D卷积块 = 2D卷积层 + BN + RELU6 3*3*3*32 步长2 32个通道输出
2. 1个自适应残差深度可拆解模块 中间层扩张倍数为1为32*1 16个通道输出
3. 2个自适应残差深度可拆解模块 中间层扩张倍数为6为16*6 24个通道输出
4. 3个自适应残差深度可拆解模块 中间层扩张倍数为6为24*6 32个通道输出
5. 4个自适应残差深度可拆解模块 中间层扩张倍数为6为32*6 64个通道输出
6. 3个自适应残差深度可拆解模块 中间层扩张倍数为6为64*6 96个通道输出
7. 3个自适应残差深度可拆解模块 中间层扩张倍数为6为96*6 160个通道输出
8. 1个自适应残差深度可拆解模块 中间层扩张倍数为6为160*6 320个通道输出
9. 1个 1*1点卷积块 = 1*1 PW点卷积 + BN + RELU6 1280个通道输出
10. 全局均值 池化 average_pooling2d
11. 1*1 PW点卷积 后 展开成1维
12. softmax 分类得到分类结果
title: mobile_net的模型优化
date: 2017/7/23 12:04:12
categories:
- 深度学习 tags:
- deeplearning
- 网络优化
- 神经网络
[TOC]
论文出自google的 MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications。 源代码和训练好的模型: tensorflow版本
mobilenet 对于alexnet运行速度提高了10倍,参数量降低了50倍!而squeezenet虽然参数量也降低了50倍,但是速度提升很小。
在建立小型和有效的神经网络上,已经有了一些工作,比如SqueezeNet,Google Inception,Flattened network等等。大概分为压缩预训练模型和直接训练小型网络两种。MobileNets主要关注优化延迟,同时兼顾模型大小。
只有一个avg pooling层,用来替换fc层,少用fc和pooling层就能减少参数量。
MobileNets模型基于深度可分解的卷积,它可以将标准卷积分解成一个深度卷积和一个点卷积(1 × 1卷积核)。标准卷积核为:a × a × c,其中a是卷积核大小,c是卷积核的通道数,本文将其一分为二,一个卷积核是a × a × 1,一个卷积核是1 ×1 × c。简单说,就是标准卷积同时完成了2维卷积计算和改变特征数量两件事,本文把这两件事分开做了。后文证明,这种分解可以有效减少计算量,降低模型大小。
标准的卷积核是一步到位,直接计算输出,跨通道的意思是:包含了图征途之间的加权混合。而可分离卷积层把标准卷积层分成两个步骤:
- 各个卷积层单独卷积
-
$1x1$ 卷积核心(1,1,M,N)跨通道结合
首先是标准卷积,假定输入F的维度是 DF×DF×M ,经过标准卷积核K得到输出G的维度 DG×DG×N ,卷积核参数量表示为 DK×DK×M×N 。如果计算代价也用数量表示,应该为 DK×DK×M×N×DF×DF 。
现在将卷积核进行分解,那么按照上述计算公式,可得深度卷积的计算代价为 DK×DK×M×DF×DF ,点卷积的计算代价为 M×N×DF×DF 。
MobileNet将95%的计算时间用于有75%的参数的1×1卷积。
宽度乘数 α ,作用是改变输入输出通道数,减少特征图数量,让网络变瘦。α 取值是0~1,应用宽度乘数可以进一步减少计算量,大约有
分辨率乘数用来改变输入数据层的分辨率,同样也能减少参数。在 α 和 ρ 共同作用下,MobileNets某一层的计算量为:$D_K×D_K×αM×ρD_F×ρD_F+αM×αN×ρD_F×ρD_F$
ρ 是隐式参数,ρ 如果为{1,6/7,5/7,4/7},则对应输入分辨率为{224,192,160,128},ρ 参数的优化空间同样是
,$\alpha = 0.5, \rho = \frac{5}{7}$时是alexnet的1/50,精度提升了0.3%
tensorflow官网给出了部署方式,支持android,ios,raspberry Pi等。
持续更新中。。。。。。。。。。。
MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 论文理解