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.rhkb.cn/news/126303.html

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

相关文章

【计算机网络】 确认应答机制与超时重传

文章目录 ACK机制——确认应答机制超时重传 ACK机制——确认应答机制 当我们客户端发送了一个数据,seq是1100,那么服务端在收到时就会回一个ack101的ACK包,代表101之前的包我都收到了,下面请你从101继续发送。然后客户端就会发送1…

Alins - 化繁为简、极致优雅的WebUI框架

最近造了个js框架 Alins,分享一下: 🚀 Alins: 最纯粹优雅的WebUI框架 English | 文档 | 演练场 | 更新日志 | 反馈错误/缺漏 | Gitee | 留言板 0 简介 0.1 前言 Alins是一款极致纯粹、简洁、优雅的Web UI框架。秉持0-API、Less is More 的…

慕尼黑主题活动!亚马逊云科技生成式AI全新解决方案,引领未来移动出行领域

IAA作为世界五大车展之一,一直对全球汽车产业的发展起着关键作用!2023年9月5日在慕尼黑开幕的IAA MOBILITY 2023以“体验联动智慧出行”为主题,紧跟移动出行领域的前沿变化,将汇集整车企业、开发者、供应商、科技公司、服务提供商…

【小沐学Unity3d】3ds Max 多维子材质编辑(Multi/Sub-object)

文章目录 1、简介2、精简材质编辑器2.1 先创建多维子材质,后指定它2.2 先指定标准材质,后自动创建多维子材质 3、Slate材质编辑器3.1 编辑器简介3.2 编辑器使用 结语 1、简介 多维子材质(Multi/Sub-object)是为一个模形&#xff0…

tab切换,左右加箭头,点击箭头实现tab切换

和正常tab切换一样原理&#xff0c;点击箭头多了步计算 <template><div><div class"tab-container"><p>{{projectName}}</p><div class"banner"><div v-for"(tab, index) in tabs" :key"index&quo…

物联网世界的无线电报之MQTT详解

文章目录 1. 前言1.1. 物联网与MQTT的关系1.2. MQTT的重要性及应用场景 2. MQTT基础2.1. MQTT的定义与起源2.2. MQTT的工作原理2.3. MQTT的协议格式2.4. 用java造个轮子 3. 深入理解MQTT3.1. MQTT的主要组件3.1.1. Publisher&#xff08;发布者&#xff09;3.1.2. Subscriber&a…

群晖NAS:通过Docker 部署宝塔面板【注册表:cyberbolt/baota】

群晖NAS&#xff1a;通过 Docker 部署宝塔面板【注册表&#xff1a;pch18/baota】 由于 docker 源地址被墙&#xff0c;在面板里面查询不到注册表&#xff0c;使用 ssh 命令行拉取 1、打开 SSH&#xff0c;链接后打开命令行 这里不赘述&#xff0c;具体自行百度 2、下载 镜像…

笔试记录-扔鸡蛋问题

写目录 一个鸡蛋两个鸡蛋K个鸡蛋 今天面试官问了我这个扔鸡蛋问题&#xff0c;以前学过&#xff0c;但是面试的时候想不起来了&#xff0c;应该是直接寄了&#xff0c;接下来总结一下这个问题的动态规划做法. 问题&#xff1a;有一个N层高的楼&#xff0c;现在给你若干个鸡蛋&a…

华为云云耀云服务器L实例评测|使用宝塔面板管理服务器,并搭建个人博客网站

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 前言 介绍&#xff1a; 一.购买使用华为云云耀服务器 …

【postgresql 基础入门】数据库服务的管理,启动、停止、状态查看、配置加载、重启都在这里

数据库服务管理 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff…

解决css设置图片大小不生效的问题

今天在做css布局时发现一个问题&#xff1a;设置图片大小不生效&#xff1a; 如上图所示&#xff1a;左上角两个图标的大小不一致&#xff0c;第一个是56x56,第二个是49x49,所以要把第二个的高度设置成56px&#xff1a; .mi-home img {height: 56px; }但是如上代码&#xff0c;…

R语言STAN贝叶斯线性回归模型分析气候变化影响北半球海冰范围和可视化检查模型收敛性...

原文链接&#xff1a;http://tecdat.cn/?p24334 像任何统计建模一样&#xff0c;贝叶斯建模可能需要为你的研究问题设计合适的模型&#xff0c;然后开发该模型&#xff0c;使其符合你的数据假设并运行&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频…

Python 03(循环语句)

Python03&#xff08;循环语句&#xff09; 文章目录 Python03&#xff08;循环语句&#xff09;一、while语句二、while实现猜数字三、while循环的嵌套while循环嵌套实例需求&#xff1a; 四、for循环1、什么 是for循环2、语法3、执行流程4、for循环的基本使用5、range()函数6…

【C++从0到王者】第二十六站:一些经典的多态面试题

文章目录 前言一、多态的常见选择二、多态的常见问答总结 前言 多态是C的一大疑难杂症&#xff0c;有很多细枝末节的东西非常繁琐&#xff0c;这里搜集了一些常见的选择与问答。可以为大家带来帮助理解多态 一、多态的常见选择 下面哪种面向对象的方法可以让你变得富有( ) A: …

WireShark抓包工具的安装

1.下载安装包 在官网或者电脑应用商城都可以下载 2.安装 打开安装包&#xff0c;点击next 点击next 选择UI界面&#xff0c;两种都装上 根据习惯选择 选择安装位置点击安装 开始安装安装成功

生成订单30分钟未支付,则自动取消,该怎么实现?

今天给大家上一盘硬菜&#xff0c;并且是支付中非常重要的一个技术解决方案&#xff0c;有这块业务的同学注意自己试一把了哈&#xff01; 在开发中&#xff0c;往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付&#xff0c;则自动取消 生成订单60秒后,给用户…

ArcGIS API for JavaScript 4.x 实现动态脉冲效果

1. 设计思路 主要通过定时刷新&#xff0c;每一次的脉冲渲染圈不停的放大&#xff0c;并且透明度缩小&#xff0c;直到达到一定的大小再退回0。 2. 实现代码 import MapView from "arcgis/core/views/MapView"; import GraphicsLayer from "arcgis/core/laye…

【Git】Git 基础

Git 基础 参考 Git 中文文档 — https://git-scm.com/book/zh/v2 1.介绍 Git 是目前世界上最先进的分布式版本控制系统&#xff0c;有这么几个特点&#xff1a; 分布式&#xff1a;是用来保存工程源代码历史状态的命令行工具保存点&#xff1a;保存点可以追溯源码中的文件…

如何用Java编写代码来等待一个线程join()??

笔者在前面几篇文章中详细的讲解了&#xff1a;线程and进程的区别及其各种对比&#xff0c;如何中断一个线程等文章&#xff0c;接下来本篇文章主要讲解&#xff1a;用Java编写代码来等待一个线程join()&#xff1f;&#xff1f; 线程之间是并发执行的&#xff0c;操作系统对于…

MySQL内外连接

MySQL内外链接 内连接显示SMITH的名字和部门名称 外连接左外连接查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 右外连接把所有的成绩都显示出来&#xff0c;即使这个成绩没有学生与它对应&#xff0c;也要显示出来列出部门名称…