🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
- 作者:韩信子@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):单位通常为 MMM,用 float32 表示。
1.2 典型结构对比
- 标准卷积层 std conv(主要贡献计算量)
- params:kh×kw×cin×coutkh×kw×cin×coutk_h\times k_w\times c_{in}\times c_{out}
- FLOPs:kh×kw×cin×cout×H×Wkh×kw×cin×cout×H×Wk_h\times k_w\times c_{in}\times c_{out}\times H\times W
- 全连接层 fc(主要贡献参数量)
- params:cin×coutcin×coutc_{in}\times c_{out}
- FLOPs:cin×coutcin×coutc_{in}\times c_{out}
- group conv
- params:(kh×kw×cin/g×cout/g)×g=kh×kw×cin×cout/g(kh×kw×cin/g×cout/g)×g=kh×kw×cin×cout/g(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:kh×kw×cin×cout×H×W/gkh×kw×cin×cout×H×W/gk_h\times k_w\times c_{in}\times c_{out}\times H\times W/g
- depth-wise conv
- params:kh×kw×cin×cout/cin=kh×kw×coutkh×kw×cin×cout/cin=kh×kw×coutk_h\times k_w\times c_{in}\times c_{out}/c_{in}=k_h\times k_w\times c_{out}
- FLOPs:kh×kw×cout×H×Wkh×kw×cout×H×Wk_h\times k_w\times c_{out}\times H\times W
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个策略:
- ① 将 3×33×33 \times 3 卷积替换为 1×11×11 \times 1 卷积
- ② 减少 3×33×33 \times 3 卷积的通道数
- ③ 将降采样操作延后,这样可以给卷积提供更大的 activation map,从而保留更多的信息,提供更高的分类准确率。
其中,策略1和2可以显著减少模型参数量,策略3可以在模型参数量受限的情况下提高模型的性能。
2.2 Fire Module
Fire Module是SqueezeNet网络的基础模块,设计如下图所示:
一个 Fire Module 由 Squeeze 和 Extract 两部分组成:
- Squeeze 部分包括了一系列连续的 1×11×11 \times 1 卷积
- Extract 部分包括了一系列连续的 1×11×11 \times 1 卷积和一系列连续的 3×33×33 \times 3 卷积,然后将 1×11×11 \times 1 和 3×33×33 \times 3 的卷积结果进行concat。
记 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。