| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 深度学习与CV教程(10) | 轻量化CNN架构 (SqueezeNetShuffleNetMobileNet等) -> 正文阅读 |
|
[人工智能]深度学习与CV教程(10) | 轻量化CNN架构 (SqueezeNetShuffleNetMobileNet等) |
🚀 优质资源分享 🚀
前言卷积神经网络的结构优化和深度加深,带来非常显著的图像识别效果提升,但同时也带来了高计算复杂度和更长的计算时间,实际工程应用中对效率的考虑也很多,研究界与工业界近年都在努力「保持效果的情况下压缩网络复杂度」,也诞生了很多轻量化网络。在本篇内容中,ShowMeAI对常见主流轻量级网络进行展开讲解。 本篇重点
1.基础知识我们先来做一点基础知识储备,本篇讲到的轻量化CNN框架,我们需要了解参数量和计算量的估测与计算方式。 1.1 复杂度分析
1.2 典型结构对比
2.SqueezeNet轻量化网络中一个著名的网络是 SqueezeNet ,它发表于ICLR 2017,它拥有与 AlexNet 相同的精度,但只用了 AlexNet 1/50 的参数量。 SqueezeNet 的核心在于采用不同于常规的卷积方式来降低参数量,具体做法是使用 Fire Module,先用 1×11×11 \times 1 卷积降低通道数目,然后用 1×11×11 \times 1 卷积和 3×33×33 \times 3 卷积提升通道数。 2.1 压缩策略SqueezeNet 采用如下3个策略:
其中,策略1和2可以显著减少模型参数量,策略3可以在模型参数量受限的情况下提高模型的性能。 2.2 Fire ModuleFire Module是SqueezeNet网络的基础模块,设计如下图所示: 一个 Fire Module 由 Squeeze 和 Extract 两部分组成:
记 Squeeze 部分的通道数为 Cs1×1Cs1×1C_{s{1\times 1}},Extract部分 1×11×11 \times 1 和 3×33×33 \times 3 的通道数分别为 Ce1×1Ce1×1C_{e{1\times 1}} 和 Ce3×3Ce3×3C_{e{3\times 3}},作者建议 Cs1×1<Ce1×1+Ce3×3Cs1×1<Ce1×1+Ce3×3C_{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 缺点如下:
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×11×11 \times 1 卷积和 3×33×33 \times 3 卷积考虑通道相关性和空间相关性,基本结构是用 1×11×11 \times 1 卷积降维,用 3×33×33 \times 3 卷积提取特征: 如果将上述结构简化,则可以得到如下的结构,可见每一个分支都包含了一个 1×11×11 \times 1 卷积和一个 3×33×33 \times 3 卷积: 从上图中可见,对于每一个分支,该模块使用 1×11×11 \times 1 卷积对输入特征图进行处理,然后使用 3×33×33 \times 3 卷积提取特征。 如果考虑空间相关性和通道相关性的解耦合,即用同一个 1×11×11 \times 1 卷积进行通道处理,将处理结果沿着通道维度拆解为若干部分,对于每一部分使用不同的 3×33×33 \times 3 卷积提取特征,则得到如下图所示的模块: 考虑一种更为极端的情况,在使用 1×11×11 \times 1 卷积之后,沿着通道维度进行最为极端的拆解,对于拆解后的每一个部分使用 3×33×33 \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 有如下两点不同:
在 Xception 中,作者直接使用了 Depthwise Seperable Convolution 作为基础模块。 3.4 Xception网络结构最后将这一基础模块叠加,并结合残差连接,就得到了Xception网络结构: 4.ShuffleNetShuffleNet 是由旷世科技提出的轻量化CNN网络,论文名称《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》,目标是改造网络架构使其能应用在移动设备上。 4.1 设计动机ShuffleNet的动机在于大量的 1×11×11 \times 1 卷积会耗费很多计算资源,而 Group Conv 难以实现不同分组之间的信息交流;ShuffleNet 的解决方式是:使用 Group Conv 降低参数量;使用Channel Shuffle实现不同组之间的信息交流,进而对ResNet进行改进,可以看作ResNet的压缩版本。 4.2 Group Conv我们再来看看Group Conv这个结构,它的基本思想是对输入层的不同特征图进行分组,再使用不同的卷积核对不同组的特征图进行卷积,通过分组降低卷积的计算量。 而Depthwise Convolution可以视作Group Conv的一种特殊情形。 假设输入通道为 CiCiC_i,输出通道为 CoCoC_o,分组数目为 ggg,Group Conv的操作如下:
4.3 Channel ShuffleGroup Conv 的一个缺点在于不同组之间难以实现通信。一个可能的解决方式是使用 1×11×11 \times 1 卷积进行通信,但是这样会引入很大的计算量。 文中提出的思路是对 Group Conv 之后的特征图沿着通道维度进行重组,这样信息就可以在不同组之间流转,即 Channel Shuffle,如下图?所示。 其实现过程如下:
4.4 ShuffleNet基础模块结合 Group Conv 和 Channel Shuffle,对ResNet的基础模块bottleneck(下图(a))进行改进,就得到了 ShuffleNet 的基础模块(下图(b)和?) 4.5 ShuffleNet缺点
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×11×11 \times 1 卷积的输入通道数目为 c1c1c_1,输出通道数目为 c2c2c_2,特征图大小为 h×wh×wh\times w,则这样一个 1×11×11 \times 1 卷积的 FLOPs 为: B=hwc1c2B=hwc1c2B=hwc_1 c_2 MAC=hw(c1+c2+c1c2)MAC=hw(c1+c2+c1c2)MAC = hw(c_1 + c_2 + c_1 c_2) MAC≥2hwB????√+BhwMAC≥2hwB+BhwMAC \ge 2 \sqrt {hwB} + \frac {B}{hw} 2) 过多的group操作会增大MAC理论推导:带 group 的 1×11×11 \times 1 卷积的FLOPs如下,其中 ggg 表示分组数目: B=hwc1c2gB=hwc1c2gB = \frac{hwc_1c_2}{g} MAC=hw(c1+c2+c1c2g)MAC=hw(c1+c2+c1c2g)MAC = hw(c_1 + c_2 + \frac {c_1c_2}{g} ) MAC=hw(c1+c2+c1c2g=hwc1+Bgc1+BhwMAC=hw(c1+c2+c1c2g=hwc1+Bgc1+Bhw\begin{aligned} 实验证明:在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 的基础模块(下图中?(d)): 图中 ? 和 (a) 相比,有如下不同之处:
(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的基础模块
6.2 MobileNet缺点
7.MobileNet V2MobileNet V2 针对 MobileNet 的上述2个问题,引入了 Inverted Residual 和 Linear Bottleneck对其进行改造,网络为全卷积,使用 RELU6(最高输出为6)激活函数。下面我们展开介绍一下核心结构: 7.1 Inverted Residual我们对比一下普通残差模块和Inverted Residual的差别 1) 普通残差模块先使用 1×11×11 \times 1 卷积降低通道数量,然后使用 3×33×33 \times 3 卷积提取特征,之后使用 1×11×11 \times 1 卷积提升通道数量,最后加上残差连接。整个过程是「压缩-卷积-扩张」。 2) Inverted Residual先使用 1×11×11 \times 1 卷积提升通道数量,然后使用 3×33×33 \times 3 卷积提取特征,之后使用 1×11×11 \times 1 卷积降低通道数量,最后加上残差连接。整个过程是「扩张-卷积-压缩」。 对比两个结构块如下图所示: 7.2 Linear Bottleneck相比于 MobileNet 的基础模块,MobileNet V2 在 Depthwise Convolution 的前面加了一个 1×11×11 \times 1 卷积,使用 ReLU6 代替 ReLU,且去掉了第二个 1×11×11 \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/41/41/4 ,在提升精度的同时基本不增加时间消耗。 8.2 尾部结构改进MobileNet V3对尾部结构做了2处修改,从下图中「上方结构」修改为「下方结构」:
8.3 通道数目调整相比于 MobileNet V2,MobileNet V3 对头部卷积通道数目进行了进一步的降低。 8.4 h-swish激活函数MobileNet V3 采用了 h?swishh?swish\mathbf{h-swish} 激活函数,对应的 swishswish\mathbf{swish} 和 h?swishh?swish\mathbf{h-swish} 激活函数计算公式如下: swish[x]=x?σ(x)swish[x]=x?σ(x)\mathbf{swish}[x] = x \cdot \sigma(x) 8.5 NAS网络结构搜索MobileNet V3 先用 NAS 搜索各个模块,得到大致的网络结构,相当于整体结构搜索;然后用NASAdapt得到每个卷积层的通道数目,相当于局部搜索。 9.参考资料
10.要点总结
斯坦福 CS231n 全套解读
ShowMeAI 系列教程推荐 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:22:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |