当前位置: 首页 > news >正文

【CVPR2023】奔跑而非行走:追求更高FLOPS以实现更快神经网络

文章目录

  • 一、论文信息
  • 二、论文概要
  • 三、实验动机
  • 四、创新之处
  • 五、实验分析
  • 六、核心代码
    • 注释版本
  • 七、实验总结

一、论文信息

  • 论文题目:Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks
  • 中文题目:奔跑而非行走:追求更高FLOPS以实现更快神经网络
  • 论文链接:点击跳转
  • 代码链接:点击跳转
  • 作者:Jierun Chen (中文名:陈洁润),香港科技大学(HKUST)、Shiu-hong Kao (高诗鸿),香港科技大学(HKUST)、Hao He (何豪),香港科技大学(HKUST)、Weipeng Zhuo (卓伟鹏),香港科技大学(HKUST)\Song Wen (温松),罗格斯大学(Rutgers University)、Chul-Ho Lee (李哲昊),德州州立大学(Texas State University)、S.-H. Gary Chan (陈绍豪),香港科技大学(HKUST)
  • 单位: 香港科技大学(HKUST)、罗格斯大学、德克萨斯州立大学
  • 核心速览:提出一种新型部分卷积(PConv)和FasterNet架构,在减少FLOPs的同时提升FLOPS,实现更快的推理速度。

二、论文概要

本文指出当前轻量级神经网络虽然FLOPs低,但由于内存访问频繁导致FLOPS(每秒浮点运算次数)不高,实际延迟并未显著降低。作者提出部分卷积(PConv),仅对部分通道进行卷积,减少计算和内存访问,并基于此构建FasterNet,在多个视觉任务上实现速度与精度的最优平衡。

三、实验动机

  • 现有轻量网络(如MobileNet、ShuffleNet)虽FLOPs低,但FLOPS也低,导致实际延迟高。

  • 深度可分离卷积(DWConv)等操作内存访问频繁,成为速度瓶颈。

  • 目标:在减少FLOPs的同时保持高FLOPS,实现真正的高速度。

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

在这里插入图片描述

四、创新之处

  • 提出PConv:仅对连续的一部分通道进行卷积,其余通道保留,大幅减少计算和内存访问。

  • T型感受野:PConv + PWConv 组合形成T型卷积,更关注中心位置,与常规卷积近似。

  • FasterNet架构:基于PConv构建,结构简洁,硬件友好,在多个设备上(GPU/CPU/ARM)均表现优异。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五、实验分析

  • PConv速度对比:在相同FLOPs下,PConv的FLOPS显著高于DWConv和GConv。

  • ImageNet分类:FasterNet在相同精度下延迟更低,吞吐量更高。

  • 下游任务(检测/分割):在COCO数据集上,FasterNet作为Backbone显著提升检测与分割性能。

  • 消融实验:验证了部分比例 r=1/4 最优,BN比LN更高效,不同规模模型适用不同激活函数。

在这里插入图片描述

六、核心代码

class Partial_conv3(nn.Module):def __init__(self, dim, n_div, forward):super().__init__()self.dim_conv3 = dim // n_divself.dim_untouched = dim - self.dim_conv3self.partial_conv3 = nn.Conv2d(self.dim_conv3, self.dim_conv3, 3, 1, 1, bias=False)if forward == 'slicing':self.forward = self.forward_slicingelif forward == 'split_cat':self.forward = self.forward_split_catelse:raise NotImplementedErrordef forward_slicing(self, x: Tensor) -> Tensor:# only for inferencex = x.clone()   # !!! Keep the original input intact for the residual connection laterx[:, :self.dim_conv3, :, :] = self.partial_conv3(x[:, :self.dim_conv3, :, :])return xdef forward_split_cat(self, x: Tensor) -> Tensor:# for training/inferencex1, x2 = torch.split(x, [self.dim_conv3, self.dim_untouched], dim=1)x1 = self.partial_conv3(x1)x = torch.cat((x1, x2), 1)return x

注释版本

class Partial_conv3(nn.Module):def __init__(self, dim, n_div, forward):super().__init__()self.dim_conv3 = dim // n_div  # 计算要进行3x3卷积的通道数self.dim_untouched = dim - self.dim_conv3  # 计算保持不变的通道数self.partial_conv3 = nn.Conv2d(self.dim_conv3, self.dim_conv3, 3, 1, 1, bias=False)  # 定义3x3卷积# 根据forward参数选择前向传播的实现方式 两个函数实质上是等价的操作,只是实现方式不同而已。if forward == 'slicing':self.forward = self.forward_slicingelif forward == 'split_cat':self.forward = self.forward_split_catelse:raise NotImplementedErrordef forward_slicing(self, x: Tensor) -> Tensor:# 仅用于推理的切片方法x = x.clone()   # 克隆输入以保持原始输入不变(为了后续残差连接)# 只对前dim_conv3个通道进行卷积操作x[:, :self.dim_conv3, :, :] = self.partial_conv3(x[:, :self.dim_conv3, :, :])return xdef forward_split_cat(self, x: Tensor) -> Tensor:# 用于训练/推理的分割-连接方法# 将输入分割为两部分:要进行卷积的部分和保持不变的部分x1, x2 = torch.split(x, [self.dim_conv3, self.dim_untouched], dim=1)x1 = self.partial_conv3(x1)  # 对第一部分进行卷积x = torch.cat((x1, x2), 1)   # 将两部分重新连接return x

七、实验总结

  • PConv 在减少FLOPs的同时显著提升FLOPS,是替代DWConv的高效选择。

  • FasterNet 在ImageNet、COCO等任务上实现SOTA速度-精度权衡。

  • 方法简洁、通用性强,适用于多种硬件平台。


文章转载自:

http://oAy4oSBp.zdqsc.cn
http://o3lyskNr.zdqsc.cn
http://Gj8WJZB1.zdqsc.cn
http://WVJilQOD.zdqsc.cn
http://WsXKpd6O.zdqsc.cn
http://B9myHNx0.zdqsc.cn
http://n1SZWVE2.zdqsc.cn
http://ivHjarDJ.zdqsc.cn
http://cK6rQKzq.zdqsc.cn
http://ZVdpwt16.zdqsc.cn
http://HsYmsx7Y.zdqsc.cn
http://eJUjbIMt.zdqsc.cn
http://u6Exha7m.zdqsc.cn
http://feTWAZC9.zdqsc.cn
http://QC6UwzbD.zdqsc.cn
http://V6lLrxlV.zdqsc.cn
http://XyEDOUJq.zdqsc.cn
http://CLX7OgNc.zdqsc.cn
http://Ao7kwj3A.zdqsc.cn
http://emy51uS1.zdqsc.cn
http://TNRjsA2d.zdqsc.cn
http://dMM6uBFP.zdqsc.cn
http://xoHZBhfe.zdqsc.cn
http://wfJsPLsS.zdqsc.cn
http://RyetoZG6.zdqsc.cn
http://mLXbGWFm.zdqsc.cn
http://zlMvfuJW.zdqsc.cn
http://X3AzUF65.zdqsc.cn
http://OKkwZ301.zdqsc.cn
http://5ulZ1ort.zdqsc.cn
http://www.dtcms.com/a/377477.html

相关文章:

  • PHP学习(第三天)
  • 数仓简要笔记-1
  • 机器人商业化落地需要突破的关键性技术
  • AI 技术体系核心概念
  • STM32H750 I2C介绍及应用
  • 计算机网络---物理层
  • 【freemarker】创建html页面
  • 【华为OD】区块链文件转储系统
  • sprintf不是像printf一样的打印函数吗
  • Js 图片加载完成 与 图片缓存加载的区别
  • 汽车动力电池管理系统(BMS):电动汽车的“智能大脑”
  • n8n add npm module 發生 Module ‘ioredis‘ is disallowed,getaddrinfo EAI_AGAIN
  • 性能——day3
  • 安卓学习 之 SeekBar(音视频播放进度条)
  • CRMEB标准版PHP订单列表功能详解与优化技巧
  • Linux基础知识(五)
  • [数据结构——lesson7.队列]
  • 在算法竞赛中怎样正确的分析一个程序的时间复杂度
  • ES6笔记4
  • 实现一个动态顺序表(C++)
  • 10 分钟上手 ECharts:从“能跑”到“生产级”的完整踩坑之旅
  • Decode Global新官网上线披露核心数据
  • 【Redis】Scan 命令使用教程:高效遍历海量数据
  • 深度解析:抗辐射电源芯片 ASP4644S2B 在空间环境中的单粒子效应表现
  • 多链冷换仓攻略:如何在 Solana、BSC 与 Base 隐身管理资产
  • 【博弈论和SG函数 | 那忘算10】巴什博奕 尼姆博弈及其变种 威佐夫博弈(附例题)
  • Cubemx+Fatfs(解决挂载Fatfs失败的问题)
  • UVa1063/LA3807 Marble Game
  • leetcode LCR 170.交易逆序对的总数
  • 【学习笔记】Https证书如何升级到国密