点击上方,选择星标或置顶,不定期资源大放送!
阅读大概需要5分钟
Follow小博主,每天更新前沿干货
【导读】之前详细介绍了轻量级网络架构的开源项目,详情请看深度学习中的轻量级网络架构总结与代码实现,本项目主要提供一个移动端网络架构的基础性工具,避免大家重复造轮子,后续我们将针对具体视觉任务集成更多的移动端网络架构。希望本项目既能让深度学习初学者快速入门,又能更好地服务科研学术和工业研发社区。后续将持续更新模型轻量化处理的一系列方法,包括:剪枝,量化,知识蒸馏等等,欢迎大家Star和Follow.
Github地址:https://github.com/murufeng/awesome_lightweight_networks
本文将主要介绍一个CPU端的最强轻量型架构,LCNet在CPU上简直飞起,精度提升比MobileNetV3快3倍!详细介绍如下:
PP-LCNet: A Lightweight CPU Convolutional Neural Network
![7c37c2e5b539e5b486063ef3b95432e7.png](https://i-blog.csdnimg.cn/blog_migrate/cc30b6d43faac9d5e7d245abe262fd85.png)
论文地址:https://arxiv.org/pdf/2109.15099.pdf
代码地址:https://github.com/murufeng/awesome_lightweight_networks/blob/main/light_cnns/mobile_cpu_network/lcnet.py
Motivation:
近年来,随着特征提取模型能力的提高,很多轻量级的网络架构应运而生,而其中利用NAS进行搜索的网络架构也层出不穷。典型的就是Facebook的FBNet系列。但很多移动端轻量级算法的优化都脱离了产业最常用的Intel CPU设备环境,模型加速缓慢。因此,在本文中,作者重新思考了在Intel-CPU上设计网络的轻量级模型元素。作者特别考虑以下三个基本问题。
如何在不增加延迟的情况下促进网络学习到更强的表征能力?
目前有哪些要素可以在CPU上提高轻量级模型精度?
如何有效结合不同的策略(激活函数、注意力模块、各模块间的位置顺序等等)在CPU上设计出轻量级模型?
本文综合上述三个问题,总结了一系列在不增加推理时间的情况下提高精度的方法,以及如何将这些策略有效地结合起来以获得更好的精度和速度之间的平衡。最终提出了一种结合Intel-CPU端侧推理特性而设计的轻量高性能网络PP-LCNet,所提架构取得了比ShuffleNetV2、MobileNetV2、MobileNetV3以及GhostNet更优的延迟-精度均衡。具体网络架构如下:
![5bf187251bbf42a1aee5a781e4bef0ad.png](https://i-blog.csdnimg.cn/blog_migrate/3b51694e588fdf77d546caa5d193e527.png)
![9cf17b6a0283657ed118d71503311e1d.png](https://i-blog.csdnimg.cn/blog_migrate/d078b6a1093ffc28bce272072033099a.png)
主要解决方案:
采用H-Swish作为激活函数,性能大幅提升,而推理速度几乎不变。
在网络合适的位置添加少量的SE模块可以进一步提升模型性能;实验表明:当把SE置于模型的尾部时,它具有更好的效果。因此,我们仅将SE模块添加到接近网络尾部的模块即可, 这种处理方式具有更好的精度-速度平衡。
根据MixNet的实验论证结果:在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能。本文通过实验总结了一些更大的卷积核在不同位置的作用,类似SE模块的位置,更大的卷积核在网络的中后部作用更明显。比如5x5卷积。
GAP后使用更大的1x1卷积层;在GoogLeNet之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致GAP后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的1x1卷积层(等同于FC层),GAP后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。
使用dropout技术可以进一步提升模型的精度。
代码实现如下:
import torch
from light_cnns import lcnet_baseline
model = lcnet_baseline()
model.eval()
print(model)
input = torch.randn(1, 3, 224, 224)
y = model(input)
print(y.size())
实验结果展示
![f1dccaca893861aa638e20bad6554538.png](https://i-blog.csdnimg.cn/blog_migrate/6f15da2a88709e6cb6c12f3295d63a82.png)
![db294416beeb9a50ddb4ab130057aacb.png](https://i-blog.csdnimg.cn/blog_migrate/7e1f758eecce5de8017a1b90e028fdfa.png)
精彩内容待更新
欢迎大家follow和star该项目地址,我们会持续跟踪前沿论文工作,若项目在复现和整理过程中有任何问题,欢迎大家在issue中提出!