关于人工智能:深度学习与CV教程10-轻量化CNN架构-SqueezeNetShuffleNetMobileNet等

  • 作者:韩信子@ShowMeAI
  • 教程地址:http://www.showmeai.tech/tutorials/37
  • 本文地址:http://www.showmeai.tech/article-detail/269
  • 申明:版权所有,转载请分割平台与作者并注明出处
  • 珍藏ShowMeAI查看更多精彩内容

前言

卷积神经网络的构造优化和深度加深,带来十分显著的图像识别成果晋升,但同时也带来了高计算复杂度和更长的计算工夫,理论工程利用中对效率的思考也很多,钻研界与工业界近年都在致力「放弃成果的状况下压缩网络复杂度」,也诞生了很多轻量化网络。在本篇内容中,ShowMeAI对常见支流轻量级网络进行开展解说。

本篇重点

  • 神经网络参数与复杂度计算
  • 轻量化网络
  • SqueezeNet
  • Xception
  • ShuffleNet V1~V2
  • MobileNet V1~V3

1.基础知识

咱们先来做一点基础知识储备,本篇讲到的轻量化CNN框架,咱们须要理解参数量和计算量的估测与计算形式。

1.1 复杂度剖析

  • 实践计算量(FLOPs):浮点运算次数(FLoating-point Operation)
  • 参数数量(params):单位通常为 \(M\),用 float32 示意。

1.2 典型构造比照

  • 规范卷积层 std conv(次要奉献计算量)

    • params:\(k_h\times k_w\times c_{in}\times c_{out}\)
    • FLOPs:\(k_h\times k_w\times c_{in}\times c_{out}\times H\times W\)
  • 全连贯层 fc(次要奉献参数量)

    • params:\(c_{in}\times c_{out}\)
    • FLOPs:\(c_{in}\times c_{out}\)
  • group conv

    • params:\((k_h\times k_w\times c_{in}/g \times c_{out}/g)\times g=k_h\times k_w\times c_{in}\times c_{out}/g\)
    • FLOPs:\(k_h\times k_w\times c_{in}\times c_{out}\times H\times W/g\)
  • depth-wise conv

    • params:\(k_h\times k_w\times c_{in}\times c_{out}/c_{in}=k_h\times k_w\times c_{out}\)
    • FLOPs:\(k_h\times k_w\times c_{out}\times H\times W\)

2.SqueezeNet

轻量化网络中一个驰名的网络是 SqueezeNet ,它发表于ICLR 2017,它领有与 AlexNet 雷同的精度,但只用了 AlexNet 1/50 的参数量。

SqueezeNet 的外围在于采纳不同于惯例的卷积形式来升高参数量,具体做法是应用 Fire Module,先用 \(1 \times 1\) 卷积升高通道数目,而后用 \(1 \times 1\) 卷积和 \(3 \times 3\) 卷积晋升通道数。

2.1 压缩策略

SqueezeNet 采纳如下3个策略:

  • ① 将 \(3 \times 3\) 卷积替换为 \(1 \times 1\) 卷积
  • ② 缩小 \(3 \times 3\) 卷积的通道数
  • ③ 将降采样操作延后,这样能够给卷积提供更大的 activation map,从而保留更多的信息,提供更高的分类准确率。

其中,策略1和2能够显著缩小模型参数量,策略3能够在模型参数量受限的状况下进步模型的性能。

2.2 Fire Module

Fire Module是SqueezeNet网络的根底模块,设计如下图所示:

一个 Fire Module 由 Squeeze 和 Extract 两局部组成

  • Squeeze 局部包含了一系列间断的 \(1 \times 1\) 卷积
  • Extract 局部包含了一系列间断的 \(1 \times 1\) 卷积和一系列间断的 \(3 \times 3\) 卷积,而后将 \(1 \times 1\) 和 \(3 \times 3\) 的卷积后果进行concat。

记 Squeeze 局部的通道数为 \(C_{s{1\times 1}}\),Extract局部 \(1 \times 1\) 和 \(3 \times 3\) 的通道数别离为 \(C_{e{1\times 1}}\) 和 \(C_{e{3\times 3}}\),作者倡议 \(C_{s{1\times 1}} \lt C_{e{1\times 1}} + C_{e{3\times 3}}\) ,这样做相当于在 Squeeze 和 Extraxt 之间插入了 bottlenet。

2.3 网络结构

Fire Module的根底上搭建SqueezeNet神经网络。它以卷积层开始,前面是 8 个 Fire Module,最初以卷积层完结,每个 Fire Module 中的通道数目逐步减少。另外网络在 conv1,fire4,fire8,conv10的前面应用了 max-pooling。

SqueezeNet 构造如下图所示,左侧是不加 shortcut 的版本,两头是加了 shortcut 的版本,右侧是在不同通道的特色图之间退出 shortcut 的版本。

SqueezeNet的性能相似于AlenNet,然而参数量只有后者的1/50,应用Deep Compression能够进一步将模型大小压缩到仅仅有0.5M。

2.4 SqueezeNet毛病

SqueezeNet 毛病如下:

  • SqueezeNet 通过更深的网络置换更多的参数,尽管有更低的参数量,然而网络的测试阶段耗时会减少,思考到轻量级模型偏向于利用在嵌入式场景,这一变动可能会带来新的问题。
  • AlaxNet 的参数量(50M)大部分由全连贯层带来,加上一部分参数量进行比照,数字稍有夸大。

3.Xception

另一个须要提到的典型网络是 Xception,它的根本思维是,在 Inception V3 的根底上,引入沿着通道维度的解耦合,根本不减少网络复杂度的前提下进步了模型的成果,应用Depthwise Seperable Convolution实现。

Xception尽管不是出于轻量级的思考而设计的模型,然而因为应用了pointwise convolution和depthwise convolution的联合,实际上也起到了升高参数量的成果,咱们也放在轻量模型里做个介绍。

3.1 设计动机

卷积在 HWC(高 \(\times\) 宽 \(\times\) 通道数)这3个维度上进行学习,既思考空间相关性,又思考通道相关性,能够思考这两种相关性解耦离开。

Xception 的做法是应用 point-wise convolution 思考 cross-channel correlation,应用 depthwise convolution 思考 spatial correlation。

3.2 从Inception到Extreme version of Inception

下图是一个 Inception V3 的根底模块,别离用 \(1 \times 1\) 卷积和 \(3 \times 3\) 卷积思考通道相关性和空间相关性,根本构造是用 \(1 \times 1\) 卷积降维,用 \(3 \times 3\) 卷积提取特色:

如果将上述构造简化,则能够失去如下的构造,可见每一个分支都蕴含了一个 \(1 \times 1\) 卷积和一个 \(3 \times 3\) 卷积:

从上图中可见,对于每一个分支,该模块应用 \(1 \times 1\) 卷积对输出特色图进行解决,而后应用 \(3 \times 3\) 卷积提取特色。

如果思考空间相关性和通道相关性的解耦合,即用同一个 \(1 \times 1\) 卷积进行通道解决,将处理结果沿着通道维度拆解为若干局部,对于每一部分应用不同的 \(3 \times 3\) 卷积提取特色,则失去如下图所示的模块:

思考一种更为极其的状况,在应用 \(1 \times 1\) 卷积之后,沿着通道维度进行最为极其的拆解,对于拆解后的每一个局部应用 \(3 \times 3\) 卷积提取特色,这一步能够应用 depthwise convolution 实现,最初将这些提取到的特色图进行 concat,这就是 Xception 的根底模块,如下图所示:

通过上图能够看到,该模块将输出数据在「通道维度」上解耦,咱们称之为 extreme version of inception module。这点与 depthwise seperable convolution 很类似。

3.3 Extreme version of Inception与Depthwise Seperable Convolution

这一操作与 Depthwise Seperable Convolution 十分相似,后者蕴含 Depthwise Convolution 和 Pointwise Convolution 两局部。

上图所示的根底模块与 Depthwise Seperable Convolution 有如下两点不同:

  • ① Depthwise Seperable Convolution先应用depthwise convolution,再应用 \(1 \times 1\) 卷积进行交融;上图所示的根底模块先应用 \(1 \times 1\) 卷积,再应用depthwise convolution。
  • ② Depthwise Seperable Convolution 的 depthwise convolution 和 \(1 \times 1\) 卷积之间没有激活函数;上图所示的根底模块的这两个操作之间有激活函数。

在 Xception 中,作者间接应用了 Depthwise Seperable Convolution 作为根底模块。

3.4 Xception网络结构

最初将这一根底模块叠加,并联合残差连贯,就失去了Xception网络结构:

4.ShuffleNet

ShuffleNet 是由旷世科技提出的轻量化CNN网络,论文名称《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》,指标是革新网络架构使其能利用在挪动设施上。

4.1 设计动机

ShuffleNet的动机在于大量的 \(1 \times 1\) 卷积会消耗很多计算资源,而 Group Conv 难以实现不同分组之间的信息交换;ShuffleNet 的解决形式是:应用 Group Conv 升高参数量;应用Channel Shuffle实现不同组之间的信息交换,进而对ResNet进行改良,能够看作ResNet的压缩版本。

4.2 Group Conv

咱们再来看看Group Conv这个构造,它的根本思维是对输出层的不同特色图进行分组,再应用不同的卷积核查不同组的特色图进行卷积,通过分组升高卷积的计算量。

而Depthwise Convolution能够视作Group Conv的一种非凡情景。

假如输出通道为 \(C_i\),输入通道为 \(C_o\),分组数目为 \(g\),Group Conv的操作如下:

  • 将输出特色图沿着通道分为 \(g\) 组,每一组的通道数目为 \(C_i/g\)。
  • 应用 \(g\) 个不同的卷积核,每一个卷积核的滤波器数量为 \(C_o/g\)。
  • 应用这 \(g\) 个不同的卷积核,对 \(g\) 组特色图别离进行卷积,失去 \(g\) 组输入特色图,每一组的通道数为 \(C_o/g\)。
  • 将这 \(g\)组的输入特色图联合,失去最终的 \(C_o\) 通道的输入特色图。

4.3 Channel Shuffle

Group Conv 的一个毛病在于不同组之间难以实现通信。一个可能的解决形式是应用 \(1 \times 1\) 卷积进行通信,然而这样会引入很大的计算量。

文中提出的思路是对 Group Conv 之后的特色图沿着通道维度进行重组,这样信息就能够在不同组之间流转,即 Channel Shuffle,如下图(c)所示。

其实现过程如下:

  • ① 输出特色图通道数目为 \(g\times n\)
  • ② 将特色图的通道维度reshape为 \((g,n )\)
  • ③ 转置为 \((n,g)\)
  • ④ 平坦化成 \(g \times n\) 个通道

4.4 ShuffleNet根底模块

联合 Group Conv 和 Channel Shuffle,对ResNet的根底模块bottleneck(下图(a))进行改良,就失去了 ShuffleNet 的根底模块(下图(b)和(c))

4.5 ShuffleNet毛病

  • Channel Shuffle 操作较为耗时,导致 ShuffleNet 的理论运行速度没有那么现实。
  • Channel Shuffle 的规定是人为制订的,更靠近于人工设计特色。

5.ShuffleNet V2

在 ShuffleNet 之后又有改良的版本 ShuffleNet V2,改良了上述提到的 ShuffleNet 毛病,缩小其耗时。

5.1 设计动机

ShuffleNet的轻量级网络设计,FLOPs 缩小了很多,但理论的工夫耗费并不短。起因是网络训练或者推理的过程中,FLOPs 仅仅是其耗时的一部分,其余操作(如内存读写、内部数据 IO 等)也会占用工夫。

ShuffleNet V2 的作者剖析了几种网络结构在 GPU/ARM 这两种平台上的计算性能指标,并提出了4条挪动端卷积网络设计的准则,依据这些准则改良 ShuffleNet 失去了 ShuffleNet V2。

咱们先来看看这4条挪动端网络设计准则:

5.2 高效CNN设计的几个准则

应用的指标是内存拜访工夫(Memory Access Cost, MAC)。用实践和试验阐明了以下几条准则。

1) 输入输出通道数目雷同时,卷积层所需的MAC最小。

实践推导:假如 \(1 \times 1\) 卷积的输出通道数目为 \(c_1\),输入通道数目为 \(c_2\),特色图大小为 \(h\times w\),则这样一个 \(1 \times 1\) 卷积的 FLOPs 为:

$$
B=hwc_1 c_2
$$

所需的存储空间如下,其中 \(hwc_1\) 示意输出特色图所需空间, \(hwc_2\) 示意输入特色图所需空间, \(c_1c_2\) 示意卷积核所需空间:

$$
MAC = hw(c_1 + c_2 + c_1 c_2)
$$

依据均值不等式可得:

$$
MAC \ge 2 \sqrt {hwB} + \frac {B}{hw}
$$

等式成立的条件是 \(c_1 = c_2\),即在给定 FLOPs,输出特色通道数和输入特色通道数相等时,MAC 达到取值的下界。 试验证实:\(c_1\)和\(c_2\)越靠近、速度越快,如下表。

2) 过多的group操作会增大MAC

实践推导:带 group 的 \(1 \times 1\) 卷积的FLOPs如下,其中 \(g\) 示意分组数目:

$$
B = \frac{hwc_1c_2}{g}
$$

MAC 如下:

$$
MAC = hw(c_1 + c_2 + \frac {c_1c_2}{g} )
$$

因而:

$$
\begin{aligned}
MAC &= hw(c_1 + c_2 + \frac {c_1c_2}{g} \\
& =hwc_1 + \frac {Bg} {c_1} + \frac {B} {hw}
\end{aligned}
$$

可见,在肯定 FLOPs 的状况下,分组数目 \(g\) 越大,MAC 也越大。

试验证实:在FLOPs根本不变的操作下,group越大,速度越慢,如下图所示。

3) 模型的碎片化水平越低,模型速度越快

试验证实:fragment 示意碎片化水平的量化,serious 示意串行,即几个卷积层的叠加,parallel 示意并行,即相似于 Inception 的设计。可见在 FLOPs 不变的状况下,分支数量越多,网络的理论耗时越大。

4) element-wise操作所带来的工夫耗费远比在FLOPs上的体现的数值要多。

element-wise 操作尽管根本不减少 FLOPs,然而在 ShuffleNet V1 和 MobileNet V2 中,其耗时是非常可观的,如下图:

试验证实:基于 ResNet 的 bottleneck 进行了试验,short-cut 是一种 element-wise 操作。试验证实short-cut 操作会带来耗时的减少。

5.3 ShuffleNet V2根底模块

基于后面提到的4条准则,对 ShuffleNet 的根底模块(下图(a)(b))进行批改,失去 ShuffleNet V2 的根底模块(下图中(c)(d)):

图中 (c) 和 (a) 相比,有如下不同之处:

  • ① 模块的开始处减少了一个 Channel Split 操作,将输出特色图沿着通道分为 \(c’\) 和 \(c-c’\) 两局部,文中 \(c’=c/2\) ,对应于「准则1」。
  • ② 勾销了 \(1 \times 1\) 卷积中的 Group 操作,对应于「准则2」。
  • ③ Channel Shuffle 移到了 Concat 前面,对应「准则3」。(因为 \(1 \times 1\) 卷积没有 Group 操作,没有必要在前面接 Channel Shuffle)
  • ④ element-wise add 替换成 concat,对应「准则4」。

(b)、(d) 之间的区别也相似,另外(d) 的两个分支都进行了降采样,且最后没有 Channel Split 操作,因而 Concat 之后的通道数目翻倍。

5.4 ShuffleNet V2整体构造

上述 ShuffleNet V2 根底模块级联,配合卷积、池化等连接,就失去了如下图的 ShuffleNet V2 构造:

6.MobileNet

另外一个十分有名的轻量化挪动端网络是 MobileNet,它是专用于挪动和嵌入式视觉利用的卷积神经网络,是基于一个流线型的架构,应用深度可拆散的卷积来构建轻量级的深层神经网络。 MobileNet 凭借其优良的性能,广泛应用于各种场景中,包含物体检测、细粒度分类、人脸属性和大规模天文定位。

MobileNet有 V1 到 V3 不同的版本,也逐渐做了一些优化和成果晋升,上面咱们来别离看看它的细节。

6.1 MobileNet核心思想

MobileNet V1 的外围是将卷积拆分成 Depthwise Conv 和 Pointwise Conv 两局部,咱们来比照一下一般网络和MobileNet的根底模块

  • 一般网络(以VGG为例) :\(3 \times 3\) Conv BN ReLU
  • Mobilenet根底模块:\(3 \times 3\) Depthwise Conv BN ReLU 和 \(1\times1\) Pointwise Conv BN ReLU

6.2 MobileNet毛病

  • ① ReLU激活函数用在低维特色图上,会毁坏特色。
  • ② ReLU输入为0时导致特色进化。用残差连贯能够缓解这一问题。

7.MobileNet V2

MobileNet V2 针对 MobileNet 的上述2个问题,引入了 Inverted Residual 和 Linear Bottleneck对其进行革新,网络为全卷积,应用 RELU6(最高输入为6)激活函数。上面咱们开展介绍一下外围构造:

7.1 Inverted Residual

咱们比照一下一般残差模块和Inverted Residual的差异

1) 一般残差模块

先应用 \(1 \times 1\) 卷积升高通道数量,而后应用 \(3 \times 3\) 卷积提取特色,之后应用 \(1 \times 1\) 卷积晋升通道数量,最初加上残差连贯。整个过程是「压缩-卷积-扩张」。

2) Inverted Residual

先应用 \(1 \times 1\) 卷积晋升通道数量,而后应用 \(3 \times 3\) 卷积提取特色,之后应用 \(1 \times 1\) 卷积升高通道数量,最初加上残差连贯。整个过程是「扩张-卷积-压缩」。

比照两个构造块如下图所示:

7.2 Linear Bottleneck

相比于 MobileNet 的根底模块,MobileNet V2 在 Depthwise Convolution 的后面加了一个 \(1 \times 1\) 卷积,应用 ReLU6 代替 ReLU,且去掉了第二个 \(1 \times 1\) 卷积的激活函数(即应用线性的激活函数),避免 ReLU 对特色的毁坏。

7.3 MobileNet V2根底模块

应用上述的办法对 MobileNet 的根底模块进行改良,失去如下所示的 MobileNet V2 根底模块:

8.MobileNet V3

在 MobileNet V2 的根底上,又提出了MobileNet V3,它的优化之处包含:引入了 SE尾部构造改良通道数目调整h-swish 激活函数利用NAS 网络结构搜寻等。咱们来一一看一下:

8.1 SE构造

MobileNet V3 在 bottleneck 中引入了 SE 构造,放在 Depthwise Convolution 之后,并且将 Expansion Layer 的通道数目变为原来的 \(1/4\) ,在晋升精度的同时根本不减少工夫耗费。

8.2 尾部构造改良

MobileNet V3对尾部构造做了2处批改,从下图中「上方构造」批改为「下方构造」:

  • 将 \(1 \times 1\) 卷积挪动到 avg pooling 前面,升高计算量。
  • 去掉了尾部构造中「扩张-卷积-压缩」中的 \(3 \times 3\) 卷积以及其前面的 \(1 \times 1\) 卷积,进一步缩小计算量,精度没有损失。

8.3 通道数目调整

相比于 MobileNet V2,MobileNet V3 对头部卷积通道数目进行了进一步的升高。

8.4 h-swish激活函数

MobileNet V3 采纳了 \(\mathbf{h-swish}\) 激活函数,对应的 \(\mathbf{swish}\) 和 \(\mathbf{h-swish}\) 激活函数计算公式如下:

$$
\mathbf{swish}[x] = x \cdot \sigma(x)
$$

$$
\mathbf{h-swish}[x] = x \frac {\mathbf{ReLU6}(x + 3)}{6}
$$

8.5 NAS网络结构搜寻

MobileNet V3 先用 NAS 搜寻各个模块,失去大抵的网络结构,相当于整体构造搜寻;而后用NASAdapt失去每个卷积层的通道数目,相当于部分搜寻。

9.参考资料

  • 卷积神经网络的复杂度剖析
  • 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception
  • 轻量级CNN网络之MobileNet V2
  • ShuffleNet V2:轻量级CNN网络中的桂冠
  • Roofline Model与深度学习模型的性能剖析

10.要点总结

  • 神经网络参数与复杂度计算
  • 轻量化网络
  • SqueezeNet
  • Xception
  • ShuffleNet V1~V2
  • MobileNet V1~V3

斯坦福 CS231n 全套解读

  • 深度学习与CV教程(1) | CV引言与根底
  • 深度学习与CV教程(2) | 图像分类与机器学习根底
  • 深度学习与CV教程(3) | 损失函数与最优化
  • 深度学习与CV教程(4) | 神经网络与反向流传
  • 深度学习与CV教程(5) | 卷积神经网络
  • 深度学习与CV教程(6) | 神经网络训练技巧 (上)
  • 深度学习与CV教程(7) | 神经网络训练技巧 (下)
  • 深度学习与CV教程(8) | 常见深度学习框架介绍
  • 深度学习与CV教程(9) | 典型CNN架构 (Alexnet, VGG, Googlenet, Restnet等)
  • 深度学习与CV教程(10) | 轻量化CNN架构 (SqueezeNet, ShuffleNet, MobileNet等)
  • 深度学习与CV教程(11) | 循环神经网络及视觉利用
  • 深度学习与CV教程(12) | 指标检测 (两阶段, R-CNN系列)
  • 深度学习与CV教程(13) | 指标检测 (SSD, YOLO系列)
  • 深度学习与CV教程(14) | 图像宰割 (FCN, SegNet, U-Net, PSPNet, DeepLab, RefineNet)
  • 深度学习与CV教程(15) | 视觉模型可视化与可解释性
  • 深度学习与CV教程(16) | 生成模型 (PixelRNN, PixelCNN, VAE, GAN)
  • 深度学习与CV教程(17) | 深度强化学习 (马尔可夫决策过程, Q-Learning, DQN)
  • 深度学习与CV教程(18) | 深度强化学习 (梯度策略, Actor-Critic, DDPG, A3C)

ShowMeAI 系列教程举荐

  • 大厂技术实现:举荐与广告计算解决方案
  • 大厂技术实现:计算机视觉解决方案
  • 大厂技术实现:自然语言解决行业解决方案
  • 图解Python编程:从入门到精通系列教程
  • 图解数据分析:从入门到精通系列教程
  • 图解AI数学根底:从入门到精通系列教程
  • 图解大数据技术:从入门到精通系列教程
  • 图解机器学习算法:从入门到精通系列教程
  • 机器学习实战:手把手教你玩转机器学习系列
  • 深度学习教程:吴恩达专项课程 · 全套笔记解读
  • 自然语言解决教程:斯坦福CS224n课程 · 课程带学与全套笔记解读
  • 深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记解读