PP-LCNet: A Lightweight CPU Convolutional Neural Network

2023-10-22 06:40

本文主要是介绍PP-LCNet: A Lightweight CPU Convolutional Neural Network,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

轻量级Trick的优化组合。

论文名称:PP-LCNet: A Lightweight CPU Convolutional Neural Network

作者:Cheng Cui, Tingquan Gao, Shengyu Wei,Yuning Du…

Code:https://github.com/PaddlePaddle/PaddleClas

摘要

  1. 总结了一些在延迟(latency)几乎不变的情况下精度提高的技术;
  2. 提出了一种基于MKLDNN加速策略的轻量级CPU网络,即PP-LCNet。
image-20211007133525281

介绍

目前的轻量级网络在启用MKLDNN的Intel CPU上速度并不理想,考虑了一下三个基本问题:

  1. 如何促使网络学习到更强的特征,但不增加延迟?
  2. 在CPU上提高轻量级模型精度的要素是什么?
  3. 如何有效地结合不同的策略来设计CPU上的轻量级模型?

Method

PP-LCNet使用深度可分离卷积作为基础结构,构建了一个类似MobileNetV1的BaseNet,并在其基础上结合现有的技术,从而得到了PP-LCNet

image-20211007191050134

参数配置:

image-20211008131450331

Better activation function

激活函数是神经网络中非线性的来源,因此其质量一定程度上决定着网络的表达能力。

当激活函数由Sigmoid变为ReLU时,网络的性能得到了很大的提升,近来出现了很多超越ReLU的激活函数,如EfficientNet的Swish,MobileNetV3中将其升级为HSwish,避免了大量的指数运算;因此本网络中使用HSwish激活函数代替ReLU。

首先让我们看一下ReLU函数的近似推导:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ f(x)&=\sum_{i=…
softplus

出于计算量的考虑和实验验证选择了ReLU

ReLU6:

增加了上界

image-20211007184950617

Swish:
f ( x ) = x ⋅ s i g m o i d ( β x ) f(x)=x\cdot sigmoid(\beta x) f(x)=xsigmoid(βx)
swish

β \beta β是个常数或可训练的参数。Swish 具备无上界有下界、平滑、非单调的特性。
Swish 在深层模型上的效果略优于 ReLU。仅仅使用 Swish 单元替换 ReLU 就能把 Mobile NASNetA 在 ImageNet 上的 top-1 分类准确率提高 0.9%,Inception-ResNet-v 的分类准确率提高 0.6%。

导数:

swish-derivation

β = 0 β = 0 β=0时,Swish变为线性函数 f ( x ) = x 2 f(x)=\frac x 2 f(x)=2x
β → ∞ β → ∞ β, σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{−x}} σ(x)=1+ex1为0或1,这时Swish变为 R e L U ( x ) = m a x ( 0 , x ) ReLU(x)=max(0,x) ReLU(x)=max(0,x)
因此Swish函数可以看做是介于线性函数与ReLU函数之间的平滑函数.

HSwish:

Swish函数的计算量是很大的,因此提出了HSwish,H表示Hard,意味着超过某个范围,激活值为常数

对ReLU6除以6再向左平移三个单位可以得到HSigmoid:

image-20211007185106870

HSwish的近似公式为 x ⋅ h σ ( x ) = r e l u 6 ( x + 3 ) 6 x\cdot h\sigma(x)=\frac{relu6(x+3)}{6} xhσ(x)=6relu6(x+3),图像如下:

SE modules at appropriate positions

注意力模块无疑是轻量级网络完美的选择,本文探究了SE模块放置的位置,发现在网络深层的效果较好。

image-20211007190945690

Larger convolution kernels

使用更大的卷积核尺寸,发现在网络深层效果较好

image-20211007191200660

Larger dimensional1×1conv layer after GAP

在网络最后的GAP之后使用Pointwise卷积进行升维,以此提高网络的性能

Drop out

实验发现drop out可以提高性能

image-20211007191715602

实验结果

image-20211007192557037

与其他网络进行对比

image-20211007192635596

这篇关于PP-LCNet: A Lightweight CPU Convolutional Neural Network的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/259735

相关文章

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

MySQL的cpu使用率100%的问题排查流程

《MySQL的cpu使用率100%的问题排查流程》线上mysql服务器经常性出现cpu使用率100%的告警,因此本文整理一下排查该问题的常规流程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一... 目录1. 确认CPU占用来源2. 实时分析mysql活动3. 分析慢查询与执行计划4. 检查索引与表

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二