共计 9819 个字符,预计需要花费 25 分钟才能阅读完成。
- 作者:韩信子 @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 · 全套笔记解读