【Block总结】PConv,部分卷积|即插即用

news/2025/2/1 4:49:43/

论文信息

标题: Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks

论文链接: https://arxiv.org/pdf/2303.03667

GitHub链接: https://github.com/JierunChen/FasterNet
在这里插入图片描述

创新点

该论文的核心创新在于提出了一种新的运算符——部分卷积(PConv),旨在提高神经网络的每秒浮点操作数(FLOPS),从而实现更快的推理速度。研究表明,传统方法往往专注于减少浮点运算(FLOPs),但这并不一定能有效降低延迟。相反,提升FLOPS的效率才是实现快速神经网络的关键。
在这里插入图片描述

方法

论文中提出的PConv运算符通过以下方式优化了神经网络的性能:

  • 减少冗余计算: PConv仅对部分输入通道应用卷积操作,而保留其他通道不变,从而降低了计算复杂度。

  • 优化内存访问: 通过减少频繁的内存访问,PConv提高了计算效率,特别是在深度卷积(DWConv)中表现尤为明显。

  • 设计理念: 该方法强调在保持较低FLOPs的同时,提升FLOPS,以实现更高的计算速度和更低的延迟。

效果

实验结果显示,使用FasterNet架构的模型在多个基准测试中表现出色:

  • 速度提升: FasterNet-T0在GPU、CPU和ARM处理器上的速度分别比MobileViT-XXS快2.8倍、3.3倍和2.4倍。

  • 准确率提高: 在ImageNet-1k数据集上,FasterNet-L模型达到了83.5%的Top-1准确率,与Swin-B相当,同时在GPU上提高了36%的推理吞吐量,并在CPU上节省了37%的计算时间。

实验结果

论文通过一系列实验验证了PConv的有效性,结果表明:

  • FLOPS与延迟的关系: 许多现有网络的FLOPS较低,导致它们在实际应用中并不够快。PConv的引入有效解决了这一问题。

  • 与其他模型的比较: FasterNet在速度和准确性上超越了其他主流目标检测器,如YOLOv7,显示出其在实际应用中的优势。

总结

论文《Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks》通过引入部分卷积(PConv)运算符,成功提升了神经网络的计算效率,强调了FLOPS的重要性。研究表明,单纯减少FLOPs并不能有效降低延迟,而提升FLOPS才是实现快速神经网络的关键。FasterNet的实验结果验证了这一理论,为未来的神经网络设计提供了新的思路和方法。

代码

import torch
from torch import nn
from torch import Tensorclass 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 xif __name__ == "__main__":# 如果GPU可用,将模块移动到 GPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 输入张量 (batch_size, channels, height, width)x = torch.randn(1,32,40,40).to(device)# 初始化 pconv 模块dim=32block = Partial_conv3(dim,n_div=4,forward='slicing')print(block)block = block.to(device)# 前向传播output = block(x)print("输入:", x.shape)print("输出:", output.shape)

输出结果:
在这里插入图片描述


http://www.ppmy.cn/news/1568334.html

相关文章

2025数学建模美赛|C题成品论文|第一问

1.模型建立与求解 1.1问题求解思路 为了准确预测奥运会奖牌分布情况,尤其是金牌数和奖牌总数,本研究采用以下步骤: (1)数据处理与特征工程 从提供的奥运会奖牌历史数据中提取核心信息。 补充外部特征,…

SpringBoot 整合 SSM

文章目录 SpringBoot 整合 SSM第一步:使用 Spring Initializr 创建项目第二步:现在配置类中配置数据库第三步:进行 MyBatis 相关操作编写数据表对应的实体类创建 mapper 接口利用 MyBaitsX 插件快速创建 xml 文件创建 Mapper 接口 SQL 实现在…

C# OpenCV机器视觉:利用CNN实现快速模板匹配

在一个阳光灿烂的周末,阿强正瘫在沙发上,百无聊赖地换着电视频道。突然,一则新闻吸引了他的注意:某博物馆里一幅珍贵的古画离奇失踪,警方怀疑是被一伙狡猾的盗贼偷走了,现场只留下一些模糊不清的监控画面&a…

Java学习教程,从入门到精通,JDBC 删除表语法及案例(103)

JDBC 删除表语法及案例 一、JDBC删除表语法 在JDBC中,删除表的操作是通过执行SQL的DROP TABLE语句来实现的。其基本语法如下: DROP TABLE [IF EXISTS] 表名;DROP TABLE:这是固定的SQL关键字,用于指定删除表的操作。[IF EXISTS]…

为什么要学习rust

内存管理:对于我来说,我就喜欢它的内存管理。我做了一个webapi,取100万行数据,导出到xlsx,再把这个xlsx文件发送给前端。分别用了java、c#、go和rust进行了相同的操作。只有rust做到了,启动时8MB内存&#…

Kafak 单例生产者实现-C#操作

前面写了一篇入门操作的文章,因为工作需要,简单修改了下如何实现单例生产者。 Kafka入门-C#操作_c# kafka-CSDN博客文章浏览阅读1.6k次,点赞20次,收藏9次。2).报错:“kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state…

SOME/IP--协议英文原文讲解3

前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…

高速PCB设计指南4——叠层设计与PCB技术

高速PCB设计指南4——叠层设计与PCB技术 1. PCB叠层设计1.1 叠层的构造1.2 叠层设计1.3 为高速信号做叠层的最佳方法1.4 层压选择1.5 叠层设计材料参数注意事项1.6 传播速度1.7 规划高速PCB叠层 2. 选择高速材料2.1 PCB材料类别2.2 信号丢失和工作频率2.3 非PTFE材料2.4 混合材…