大纲
- Mobile Net V1简介
- 分组卷积
- 串联信息
- 分组+串联
- Mobile Net V1的深度可分离卷积
- 模型网络结构
- 代码实现
Mobile Net V1简介
随着2012年的AlexNet在ImageNet竞赛中获得冠军,越来越多的深度神经网络被人们提出,例如优秀的VGG系列、GoogleNet、Resnet系列等等。这些深度学习算法相较于传统机器学习分类算法而言,已经相当的出色,但是随着人们不断的加深网络,模型计算量产生的巨大存储压力和计算开销,已经开始严重影响深度神经网络在一些低功率领域的应用,例如ResNet系列中的ResNet152,网络层数已经达到152层,模型权重大小达到上百兆,这也使得我们几乎不可能在ARM芯片上跑ResNet152。
近些年,使用AI系统的机器人、无人驾驶、智能手机以及各类可穿戴设备的发展日新月异,急需一种能在算法层面有效的压缩存储和计算量的方法,使AI算法能在有限的计算平台上有效运转。而Mobile Net对传统卷积模块进行了改进,该结构更高效,为在移动设备上部署带来了可能。
Mobile Net V1是2017年Google发布的网络架构,正如其名,它是一种模型体积较小、可训练参数及计算量较少并适用于移动设备的卷积神经网络。旨在充分利用有限的计算资源,最大化模型的准确性,以满足有限资源下的各种应用案例,是部署至边缘侧常用的模型之一。mobileNet V1的主要创新点是用深度可分离卷积(depthwise separable convolution)代替普通的卷积,并使用宽度乘数(width multiply)减少参数量,它可在牺牲极少精度的同时去换取更好的数据吞吐量。
分组卷积
如果想要学习深度可分离卷积,首先要了解什么是分组卷积(Group Convolution),可以说,看懂了分组卷积,也就明白了什么是深度可分离卷积。分组卷积最早见于AlexNet,当时使用分组卷积的目的是将整个模型拆分成两块,这样就可以放到2个GPU上进行并行运算。
首先我们假设卷积的输入特征图尺寸为 W ∗ H ∗ C i n W*H*C_{in} W∗H∗Cin ,在padding为same,stride为1的情况下,输出特征图尺寸为 W ∗ H ∗ C o u t W*H*C_{out} W∗H∗Cout 。
首先我们先看看标准卷积的计算:
如果使用标准卷积进行计算,我们可知,此时的理论计算量FLOPs为:
F L O P s = k w ∗ k h ∗ C i n ∗ C o u t ∗ W ∗ H \begin{aligned} FLOPs=k_{w} * k_{h}*C_{in}*C_{out}*W*H\\ \end{aligned}\\ FLOPs=kw∗kh∗Cin∗Cout∗W∗H
而分组卷积就是将输入的拆分为g个独立分组(假设可整除),分别进行卷及计算,可表示为:
- 把输入特征图拆分为g组,每组尺寸为 W ∗ H ∗ ( C i n / g ) W*H*(C_{in}/g) W∗H∗(Cin/g) ;
- 把输出特征图也拆分为g组,每组尺寸为 W ∗ H ∗ ( C o u t / g ) W*H*(C_{out}/g) W∗H∗(Cout/g) ;
- 按顺序对每组内的特征图做普通卷及计算,输出g个 W ∗ H ∗ ( C o u t / g ) W*H*(C_{out}/g) W∗H∗(Cout/g) 的特征图,总的输出和最开始定义的 W ∗ H ∗ C o u t W*H*C_{out} W∗H∗Cout 的输出尺寸一致。
此时我们的理论计算量FLOPs为:
F L O P s =