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

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

论文信息

标题: 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 Tensor

class Partial_conv3(nn.Module):

    def __init__(self, dim, n_div, forward):
        super().__init__()
        self.dim_conv3 = dim // n_div
        self.dim_untouched = dim - self.dim_conv3
        self.partial_conv3 = nn.Conv2d(self.dim_conv3, self.dim_conv3, 3, 1, 1, bias=False)

        if forward == 'slicing':
            self.forward = self.forward_slicing
        elif forward == 'split_cat':
            self.forward = self.forward_split_cat
        else:
            raise NotImplementedError

    def forward_slicing(self, x: Tensor) -> Tensor:
        # only for inference
        x = x.clone()   # !!! Keep the original input intact for the residual connection later
        x[:, :self.dim_conv3, :, :] = self.partial_conv3(x[:, :self.dim_conv3, :, :])

        return x

    def forward_split_cat(self, x: Tensor) -> Tensor:
        # for training/inference
        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



if __name__ == "__main__":
    # 如果GPU可用,将模块移动到 GPU
    device = 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=32
    block = 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.kler.cn/a/526109.html

相关文章:

  • 解析“in the wild”——编程和生活中的俚语妙用
  • Kubernetes 环境中的自动化运维实战指南
  • Linux文件原生操作
  • 前端-Rollup
  • C++:PTA L2-003 月饼
  • 16届蓝桥杯寒假刷题营】第2期DAY5IOI赛
  • 【数据结构】最有效的实现栈和队列的方式(CC++语言版)
  • 计算机组成原理学习笔记
  • 组合模式 - 组合模式的实现
  • 从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(OLED设备层封装)
  • Sqoop源码修改:增加落地HDFS文件数与MapTask数量一致性检查
  • [Java]泛型(二)泛型方法
  • AJAX综合案例——图书管理
  • 01-时间与管理
  • DeepSeek-R1 论文解读:强化学习如何 “炼” 出超强推理模型?
  • 使用 Context API 管理临时状态,避免 Redux/Zustand 的持久化陷阱
  • Web-3.0学习路线
  • Python学习之旅:进阶阶段(六)数据结构-有序字典(collections.OrderedDict)
  • 单片机串口打印printf函数显示内容(固件库开发)
  • 蓝桥云客 好数
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.24 随机宇宙:生成现实世界数据的艺术
  • DeepSeek r1本地安装全指南
  • Java中运行Python程序
  • vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列
  • Rust语言进阶之chain用法实例(九十七)
  • 爱快 IK-W35 面板式AP 简单开箱评测和拆解,双频WiFi6 AX3000,2.5G网口