MobileNet
卷积神经网络(CNN)已经普遍应用在计算机视觉领域,并且已经取得了不错的效果。图1为近几年来CNN在ImageNet竞赛的表现,可以看到为了追求分类准确度,模型深度越来越深,模型复杂度也越来越高,如深度残差网络(ResNet)其层数已经多达152层。
然而,在某些真实的应用场景如移动或者嵌入式设备,如此大而复杂的模型是难以被应用的。首先是模型过于庞大,面临着内存不足的问题,其次这些场景要求低延迟,或者说响应速度要快,想象一下自动驾驶汽车的行人检测系统如果速度很慢会发生什么可怕的事情。所以,研究小而高效的CNN模型在这些场景至关重要,至少目前是这样,尽管未来硬件也会越来越快。目前的研究总结来看分为两个方向:一是对训练好的复杂模型进行压缩得到小模型;二是直接设计小模型并进行训练。不管如何,其目标在保持模型性能(accuracy)的前提下降低模型大小(parameters size),同时提升模型速度(speed, low latency)。本文的主角 MobileNet 属于后者,其是Google最近提出的一种小巧而高效的 CNN 模型,其在 accuracy 和 latency 之间做了折中。下面对 MobileNet 做详细的介绍。
MobileNet 是基于深度可分离卷积的。通俗的来说,深度可分离卷积干的活是:把标准卷积分解成深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)。这么做的好处是可以大幅度降低参数量和计算量。
Depthwise+Pointwise可以近似看作一个卷积层:
普通卷积:3x3 Conv+BN+ReLU
Mobilenet卷积:3x3 Depthwise Conv+BN+ReLU 和 1x1 Pointwise Conv+BN+ReLU
参数量降低
假设输入通道数为3,要求输出通道数为256,两种做法:
1.直接接一个3×3×256的卷积核,参数量为:3×3×3×256 = 6,912
2.DW操作,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795(3个特征层(33的卷积核)),卷积深度参数通常取为1
MobileNet V1
要解决什么问题?
有一些应用场景(如移动设备、嵌入式设备)对模型大小、计算量都有限制。本文的目标就是构建小且高效的网络结构。
building small and efficient neural networks.
用了什么方法解决?
通过depthwise separable convolutions替代传统卷积网络,减少计算量。
在网络中设置两个参数(width multiplier, resolution multiplier)来平衡准确率与模型大小。效果如何?
在模型大小显著降低的情况下,在ImageNet等数据集上得到了很好的效果。
控制MobileNet模型大小的两个超参数
Width Multiplier, $\alpha$:
- 该参数用于控制特征图的 channel 数量, 所有卷积层 kernel 数量统一乘以缩小因子 $\alpha$
- $\alpha \epsilon (0,1]$ , 常见取值: 1, 0.75,0.5,0.25
Resolution Multiplier, $/rho$: - 该参数用于控制特征图的宽和高。
MobileNet v2
MobileNet V2是Google继V1之后提出的下一代轻量化网络,主要解决了V1在训练过程中非常容易特征退化的问题,V2相比V1效果有一定提升。
通过 ResNet 结构的特征复用,可以很大程度上缓解这种特征退化问题
Mobilenet v2 提出了 Bottlenecks + Inverted residual block 作为网络
采用 Inverted residual block 结构。该结构使用 Point wise convolution 先对feature map 进行升维,再在升维后的特征接 ReLU,减少 ReLU 对特征的破坏。
MobileNet V3
重点:
PyTorch 实现 MobileNetV3 架构;
h-swish 和 h-sigmoid 的设计;
新的 MobileNet 单元;
SE 结构和 Residual 结构;
Last Stage:提前Avg Pooling,和使用1x1卷积;
MobileNet V3 的网络结构可以分为三个部分:
起始部分:1个卷积层,通过 3x3 的卷积,提取特征;
中间部分:多个卷积层,不同版本,层数和参数不同;
最后部分:通过两个1x1的卷积层,代替全连接,输出类别。
def forward(self, x):
# 起始部分
out = self.init_conv(x)
# 中间部分
out = self.block(out)
# 最后部分
out = self.out_conv1(out)
batch, channels, height, width = out.size()
out = F.avg_pool2d(out, kernel_size=[height, width])
out = self.out_conv2(out)
out = out.view(batch, -1)
return out
h-switch 和 h-sigmoid 是非线性激活函数
中间部分:
SE:Squeeze-and-Excite结构,压缩和激发;
NL:Non-Linearity,非线性;HS:h-swish激活函数,RE:ReLU激活函数;
bneck:bottleneck layers,瓶颈层;
exp size:expansion factor,膨胀参数
MobileBlock
三个必要步骤:
1x1卷积,由输入通道,转换为膨胀通道;
3x3或5x5卷积,膨胀通道,使用步长stride;
1x1卷积,由膨胀通道,转换为输出通道。
参考链接:
CNN模型之MobileNet
(二十八)通俗易懂理解——MobileNetV1 & MobileNetV2
探索与实现 MobileNet V3 网络结构
请多多指教。
文章标题:MobileNet
本文作者:顺强
发布时间:2019-12-13, 23:59:00
原始链接:http://shunqiang.ml/cnn-mobilenet/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。