FasterNet(PConv)paper笔记(CVPR2023)

论文:Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks

先熟悉两个概念:FLOPS和FLOPs(s一个大写一个小写)
FLOPS: FLoating point Operations Per Second的缩写,即每秒浮点运算次数,或表示为计算速度。是一个衡量硬件性能的指标。
FLOPs: FLoating point OPerationS 即 浮点计算次数,包含乘法和加法,只和模型有关,可以用来衡量其复杂度。
总结起来,S大写的是计算速度,小写的是计算量。计算量 / 计算速度 = 计算时间Latency

摘要部分

之前很多网络都聚焦在减少计算量(FLOPs)上,但是作者发现即使FLOPs减少了,latency也没有相应地线性减少。
认为这是由于速度FLOPS并没有相应地提高,而较低的FLOPS是由于频繁地访问内存。

为此,paper主要研究了DWConv(Depthwise convolution).
提出了部分卷积PConv. 可以同时降低FLOPs和提高FLOPS,进而提高速率。
又提出了以PConv为主要元素的backbone网络FasterNet, 有T,S,M,L版本,在提高效率的同时也提高精度。

在这里插入图片描述

背景

对比一些降低了计算量FLOPs的网络,它们的计算速度FLOPS对比,作者发现它们大部分的FLOPS比ResNet50都低。

在这里插入图片描述

因为Latency = FLOPs / FLOPS.
所以即使降低了FLOPs,而FLOPS较低,也不会缩短相应的计算时间。

相关工作

CNN:
在实际应用中,CNN的计算效率和精度一样重要,所以有很多改进效率的工作,
较流行的是group卷积和深度可分离卷积,应用它们的有MobileNet, ShuffleNet, GhostNet等。
这些工作通过考虑filter的冗余,减少参数和FLOPs。但是为了补偿下降的精度,一般会增加channel,而channel的增加会导致内存访问量的增加。
而作者通过考虑feature map的冗余,提出部分卷积PConv,降低FLOPs, 同时降低内存访问量。

ViT,MLP和变体
很多工作致力于改进ViT的结构和训练方式,主要的趋势是通过降低attention, 卷积的复杂度,追求一种精度和计算时间的平衡。
还有工作把attention换成MLP。不过这些常演变成类似于CNN的工作。
作者根据以往paper认为attention相比于CNN的优势还不清晰,而且attention比CNN要慢,在工业界没有CNN那么受欢迎。
目前深度可分离卷积仍然比较流行,所以作者就专注研究DWConv, 找出困扰FLOPS的点。

对深度可分离卷积不太熟悉的可参考MobileNetV1。

内存访问量

之前提到FLOPS受限于内存访问量,下面就看一下内存访问量。
假设input size为:(c, h, w), 卷积核为k*k, output size为(c, h, w)
那么DWConv的FLOPs为在这里插入图片描述
(卷积核窗口移动次数为output size, 每次计算量为k2 *c,不需要扩张channel)
普通卷积的FLOPs为在这里插入图片描述
(卷积核窗口移动次数为output size, 普通卷积会把channel扩张后计算,参见下图,因为input 和output channel都是c, 所以扩张后为c2
在这里插入图片描述

深度可分离卷积中DWConv后面会跟一个1x1卷积,即PWConv(pointwise convolution)。

深度可分离卷积不能算是普通卷积的替代品,因为精度会下降,对此实际应用中会增加channel作为补偿。
channel也称为网络宽度,假设DWConv的channel增加到c’ (c’ > c), 例如在inverted residual blocks中channel就扩张了6倍。
channel的扩张增加了内存访问量,增加时间延迟,尤其是I/O-bound设备。

这里访问图片/特征图 和 卷积filter的内存访问量为:
DWConv: 在这里插入图片描述
普通卷积:在这里插入图片描述
其中h * w * 2c’是I/O操作的内存访问,很难再进一步优化(乘2是访问input和output内存,假设了它们size相同)。

提出部分卷积PConv

部分卷积如下图,不同于以往对input的所有channel都做卷积,PConv只对其中一部分channel cp做卷积,剩下的放在那不去处理。

在这里插入图片描述

为什么可以只做部分卷积而不影响精度?
是由于作者观察到不同channel的feature map高度相似,如下图。这个feature map的冗余在其他的paper中也提到过。
这是一个预训练的ResNet50的特征图。

在这里插入图片描述

既然特征图这么多冗余,不如只用其中的一部分进行卷积。

为了内存的连续性,选取前段或后段连续cp个channel,用来代表整个特征图。
仍然假设input和output 的channel一样,那么PConv的FLOPs为
在这里插入图片描述
(卷积核和input map一个窗口计算量为k2 * cp2(普通卷积计算),卷积核窗口移动次数为output size)

如果cp / c = 1/4, 那么PConv的FLOPs就仅为普通卷积的1/16.

PConv的内存访问量:
在这里插入图片描述
(input,output feature map 和 卷积核内存访问)
如果cp / c = 1/4, 那么内存访问量将是普通卷积的1/4.

既然只取1/4的input channel, 那是不是可以把剩下的channel移除?
如果移除,就变成了更少channel的普通卷积,不再是部分卷积了;而且留着这些channel可以让后续的PWConv利用起来。

既然说到了后续的PWConv。

PConv接PWConv(1x1卷积)

前面说到PConv只利用了一部分channel, channel没有被充分利用啊。
这时后面再跟一个PWConv就可以充分利用channel信息。

PConv和PWConv的结合体有点像T型的卷积,如下图。感受野集中在中间位置。而普通卷积是均匀分布的。

在这里插入图片描述

那么感受野集中在中间有没有影响呢?为此作者调查了一下ResNet18的每一个filter,
用Frobenius norm计算重要性,卷积核size为k2 * c。值越大认为越重要。

在这里插入图片描述

然后统计出来下面的直方图,3x3的卷积核位置依次为1~9,
从图中大致认为中间的位置5重要性最高,因此认为上面的T型卷积应该可以近似普通卷积。
在这里插入图片描述

虽然T型卷积可以直接计算,不过作者认为拆分成PConv和PWConv更好,可以利用中间卷积的冗余性,而且进一步降低FLOPs.
假设input和output的size都是(h,w,c), 那么T型卷积的FLOPs为

在这里插入图片描述

拆分成PConv和PWConv的FLOPs为
在这里插入图片描述

FasterNet

作者提出了一个用PConv构建出来的backbone网络FasterNet, 结构尽可能simple.
结构图如下,4个stage.
在这里插入图片描述

其中embedding layer是一个4x4 conv, stride=4, 相当于一个卷积核对图片的每一块处理。
merging layer是2x2 conv, stride=2, 相当于把前面分割成块处理的图 有overlap地合并起来。
这样做也可以下采样,扩张channel.
观察到最后2个stage中的block访问内存较少,有较高的FLOPS, 所以相对地把后2个stage多放一些blocks.
每个PConv跟2个1x1卷积,加上residual.

BN层和激活函数仅放在中间的PWConv后面,以保持feature多样性,降低复杂度。
选择BN而不是其他的归一化是因为BN可以和Conv层结合到一起。

激活函数的选择也是根据实验得来的,小模型用GELU,大模型用ReLU.
同样实验得到 cp / c 最好是1/4.
在这里插入图片描述

几种卷积在不同平台上FLOPS, latency对比

在这里插入图片描述

为了验证PConv是不是真的比DWConv更近似于普通卷积,
作者把ResNet50的4个stage中 每个stage的第一个3x3 conv的input, output 特征图提取出来。
分成train, val, test集,用不同卷积组合训练之后,再用test集测试output特征图的MSE loss.
当然是loss越小,这个卷积组合就越近似于普通卷积(但是比普通卷积更快)。

在这里插入图片描述

在COCO数据集上的latency和mAP对比。

在这里插入图片描述
最后贴上FasterNet的结构。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/73761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ETLCloud制造业轻量级数据中台解决方案

制造业数据处理特点 制造业在业务发展过程中产生大量的业务交易数据以及设备运行过程中的状态数据,但是制造业有别于其他互联网或零售行业,其数据处理具有以下特点: 数据量不大,大部分业务系统的数据库表在1000W以下数据结构复杂…

小白参加红队,需要做好哪些准备?

在本文中,我们将为读者介绍要想加入红队,需要掌握哪些方面的技能。 CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方一个…

【广州华锐互动】元宇宙技术如何赋能传统工业企业?

随着科技的飞速发展,我们正处于工业革命4.0的时代,数字化、网络化和智能化正在深刻地改变着我们的生活和工作方式。在这个变革的大潮中,工业元宇宙平台应运而生,为企业带来了前所未有的机遇和挑战。 广州华锐互动开发的工业元宇宙…

咖啡店小程序:吸引顾客的创新营销手段

近日,“酱香拿铁”的大火让大家再次把目标聚焦在年轻人都喜欢的咖啡上。现在咖啡已经成为年轻一代的社交硬通货,咖啡店也遍地开花。而随着移动互联网的快速发展,咖啡店小程序已经成为了各大咖啡店主的选择,因为它提供了便捷的方式…

pytorch搭建squeezenet网络的整套工程,及其转tensorrt进行cuda加速

本来,前辈们用caffe搭建了一个squeezenet的工程,用起来也还行,但考虑到caffe的停更后续转trt应用在工程上时可能会有版本的问题所以搭建了一个pytorch版本的。 以下的环境搭建不再细说,主要就是pyorch,其余的需要什么p…

Gradle下载库速度过慢解决办法

最近搞了个Gradle的项目,项目下载依赖库太慢了,于是… Gradle下载库速度过慢的问题可能由多种原因导致,以下是一些可能的解决方案: 1、使用国内镜像站点: 你可以改变Gradle的配置,使用国内的镜像站点来下…

go开发之个人微信的开发

简要描述: 检测好友状态 请求URL: http://域名地址/checkZombie 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明…

SpringCloudAlibaba Gateway(一)简单集成

SpringCloudAlibaba Gateway(一)简单集成 随着服务模块的增加,一定会产生多个接口地址,那么客户端调用多个接口只能使用多个地址,维护多个地址是很不方便的,这个时候就需要统一服务地址。同时也可以进行统一认证鉴权的需求。那么服…

go语言基础操作---七

socket简单介绍—套接字编程 什么是Socket Socket,英文含义是【插座、插孔】,一般称之为套接字,用于描述IP地址和端口。可以实现不同程序间的数据通信。 Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可…

[移动通讯]【Carrier Aggregation in LTE】【 Log analysis-2】

前言: 接 [移动通讯]【Carrier Aggregation in LTE】【 Theory Log analysis-1】 这里面 主要讲解一下日志分析 目录: 总体流程 UE Capbaility Information MeasurementReport RRC Connection Reconfiguration RRCConnectionReconfiguration…

开源药店商城系统源码比较:哪个适合你的药品电商业务

在构建药品电商业务时,选择适合的药店商城系统源码是至关重要的决策之一。开源药店商城系统源码提供了快速入门的机会,但在选择之前,您需要仔细考虑您的需求、技术要求和可扩展性。本文将比较几个流行的开源药店商城系统源码,以帮…

LSTM基础

LSTM 视频讲得非常好 https://www.bilibili.com/video/BV1644y1W7sD/?spm_id_from333.788&vd_source3b42b36e44d271f58e90f86679d77db7门的概念 过去,不过去,过去一部分 点乘,0 concatenation,pointwise LSTM RNN 上一…

C/C++之链表的建立

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.头插 1.1简介 1.2代码实现头插 …

系统报错“由于找不到msvcp140.dll无法继续执行代码”的处理方法

我在使用电脑时,突然发现了一个错误提示:“无法启动程序,因为找不到msvcp140.dll文件”。这让我非常困惑,因为我确定这个文件应该存在于我的电脑上。但是电脑依然报错“由于找不到msvcp140.dll无法继续执行代码”,这个…

vue仿企微文档给页面加水印(水印内容可自定义,超简单)

1.在src下得到utils里新建一个文件watermark.js /** 水印添加方法 */let setWatermark (str1, str2) > {let id 1.23452384164.123412415if (document.getElementById(id) ! null) {document.body.removeChild(document.getElementById(id))}let can document.createE…

如何使用PyTorch训练LLM

推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 像LangChain这样的库促进了上述端到端AI应用程序的实现。我们的教程介绍 LangChain for Data Engineering & Data Applications 概述了您可以使用 Langchain 做什么,包括 LangChain 解决的问题&#xf…

Visual Stadio使用技巧

C语言调试技巧 Debug 和 Release 的介绍 Debug:通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试(可调试)。 Release:通常称为发布版本,它往往时进行了各种优化&a…

SpringMVC_执行流程

四、SpringMVC执行流程 1.SpringMVC 常用组件 DispatcherServlet:前端控制器,用于对请求和响应进行统一处理HandlerMapping:处理器映射器,根据 url/method可以去找到具体的 Handler(Controller)Handler:具体处理器(程…

【Springcloud】Actuator服务监控

【Springcloud】Actuator服务监控 【一】基本介绍【二】如何使用【三】端点分类【四】整合Admin-Ui【五】客户端配置【六】集成Nacos【七】登录认证【八】实时日志【九】动态日志【十】自定义通知 【一】基本介绍 (1)什么是服务监控 监视当前系统应用状…

【NLP的python库(02/4) 】:Spacy

一、说明 借助 Spacy,一个复杂的 NLP 库,可以使用用于各种 NLP 任务的不同训练模型。从标记化到词性标记再到实体识别,Spacy 还生成了精心设计的 Python 数据结构和强大的可视化效果。最重要的是,可以加载和微调不同的语言模型以适…