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

深度学习中卷积的计算复杂度与内存访问复杂度

深度学习中卷积的计算复杂度与内存访问复杂度

在深度学习中,普通卷积(Standard Convolution)、深度可分离卷积(Depthwise Separable Convolution, DWConv)和部分卷积(Partial Convolution, PConv)是常见的卷积操作。以下是它们的计算复杂度和内存访问复杂度的分析。


1. 普通卷积(Standard Convolution)
  • 定义:标准卷积通过滑动窗口将输入特征图与权重核进行逐元素乘加操作。
  • 符号定义:
    • 输入特征图尺寸:$H \times W \times C_{in}$
    • 卷积核大小:$K \times K$
    • 输出通道数:$C_{out}$
    • 假设步幅为1,填充使得输出特征图尺寸为$H \times W \times C_{out}$
  • 计算复杂度: $ F_{std} = H \cdot W \cdot C_{out} \cdot K^2 \cdot C_{in} $
    • 每个输出像素需要对$K^2 \cdot C_{in}$个输入值进行乘加操作。
    • 总共有$H \cdot W \cdot C_{out}$个输出像素。
  • 内存访问复杂度:
  • 权重访问次数:$C_{out} \cdot K^2 \cdot C_{in}$(权重只加载一次)。
  • 输入特征图访问次数:H \cdot W \cdot C_{in}(每个滑动窗口读取一次输入)。
  • 输出特征图写入次数:$H \cdot W \cdot C_{out}$
  • 总内存访问次数: $ M_{std} = H \cdot W \cdot( C_{in}+C_{out}) +K^{2} \cdot C_{in} \cdot C_{out} $

2. 深度可分离卷积(Depthwise Separable Convolution, DWConv)
  • 定义:DWConv分为两步:深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。
    • 深度卷积:对每个输入通道独立应用卷积核。
    • 逐点卷积:使用$1 \times 1$卷积调整通道数。
  • 符号定义:
    • 深度卷积:输入特征图尺寸$H \times W \times C_{in}$,卷积核大小$K \times K$,输出特征图尺寸$H \times W \times C_{in}$
    • 逐点卷积:输入特征图尺寸$H \times W \times C_{in}$,输出特征图尺寸$H \times W \times C_{out}$
  • 计算复杂度:
    • 深度卷积: $ F_{dw} = H \cdot W \cdot C_{in} \cdot K^2 $
    • 逐点卷积: $ F_{pw} = H \cdot W \cdot C_{in} \cdot C_{out} $
    • 总计算复杂度: $ F_{dwconv} = F_{dw} + F_{pw} = H \cdot W \cdot C_{in} \cdot K^2 + H \cdot W \cdot C_{in} \cdot C_{out} $
  • 内存访问复杂度:
  • 深度卷积:
    • 权重访问次数:$C_{in} \cdot K^2$
    • 输入特征图访问次数:$H \cdot W \cdot C_{in}$
    • 输出特征图写入次数:$H \cdot W \cdot C_{in}$
    • 深度卷积的总内存访问次数:H \cdot W \cdot 2C_{in} + C_{in} \cdot K^2
  • 逐点卷积:
    • 权重访问次数:$C_{in} \cdot C_{out}$
    • 输入特征图访问次数:$H \cdot W \cdot C_{in}$
    • 输出特征图写入次数:$H \cdot W \cdot C_{out}$
    • 逐点卷积的总内存访问次数:C_{in} \cdot C_{out} + H \cdot W \cdot (C_{in} + C_{out} )
  • 总内存访问次数: $ M_{dwconv} = H \cdot W \cdot 2C_{in} + C_{in} \cdot K^2 + C_{in} \cdot C_{out} + H \cdot W \cdot (C_{in} + C_{out} )$

3. 部分卷积(Partial Convolution, PConv)
  • 定义:PConv是一种只对部分通道进行正常卷积的方法,其他部分的通道进行恒等映射比进行任何操作。
  • 符号定义:
    • 输入特征图尺寸:$H \times W \times C_{in}$
    • 卷积核大小:$K \times K$
    • 输出通道数:$C_{out}$
    • 假设其中进行正常卷积的操作的通道数为C_p
  • 计算复杂度:
    • 标准卷积计算量:$H \cdot W \cdot C_{p} \cdot K^2 \cdot C_{p}=H \cdot W \cdot C_{p}^{2} \cdot K^2$
    • 总计算复杂度: $ F_{pconv} = H \cdot W \cdot C_{p}^{2} \cdot K^2 $
  • 内存访问复杂度:
  • 权重访问次数:$C_{p} \cdot K^2 \cdot C_{p}= K^2 \cdot C_{p}^{2}$
  • 输入特征图访问次数:$H \cdot W \cdot C_{p}$
  • 输出特征图写入次数:$H \cdot W \cdot C_{p}$
  • 总内存访问次数: $ M_{pconv} = H \cdot W \cdot 2 C_{p} + K^2 \cdot C_{p}^2 $

总结对比表

特性

Standard Convolution

Depthwise Separable Convolution (DWConv)

Partial Convolution (PConv)

计算复杂度

$H \cdot W \cdot C_{out} \cdot K^2 \cdot C_{in}$

$H \cdot W \cdot C_{in} \cdot K^2 + H \cdot W \cdot C_{in} \cdot C_{out}$

$ F_{pconv} = H \cdot W \cdot C_{p}^{2} \cdot K^2 $

内存访问复杂度

$ M_{std} = H \cdot W \cdot( C_{in}+C_{out}) +K^{2} \cdot C_{in} \cdot C_{out} $$ M_{dwconv} = H \cdot W \cdot 2C_{in} + C_{in} \cdot K^2 + C_{in} \cdot C_{out} + H \cdot W \cdot (C_{in} + C_{out} )$$ M_{pconv} = H \cdot W \cdot 2 C_{p} + K^2 \cdot C_{p}^2 $

以上是对三种卷积操作的计算复杂度和内存访问复杂度的详细分析。

参考链接:神经网络参数量、计算量(FLOPS)、内存访问量(AMC)计算详解-CSDN博客

http://www.dtcms.com/a/167910.html

相关文章:

  • 回归树:从原理到Python实战
  • 三生原理的范式引领价值?
  • 408真题笔记
  • Linux基础指令【下】
  • EBO的使用
  • 数字智慧方案5974丨智慧农业大数据应用平台综合解决方案(79页PPT)(文末有下载方式)
  • [vscode]全局配置nim缩进
  • 【工具变量】上市公司治理水平数据集-含参考文献及dta、xlsx格式(2003-2023年)
  • ClackyAI:下一代智能云开发环境的技术革新与实践价值
  • 多节点监测任务分配方法比较与分析
  • 数字智慧方案5976丨智慧农业顶层设计建设与运营方案(59页PPT)(文末有下载方式)
  • 面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解
  • Umi-OCR项目(1)
  • 第七章:赤 色广播计划的全面启动
  • VAO与VBO的相关操作
  • Hive数据倾斜 常见解决办法
  • DeepSeek V3 训练策略:FP8混合精度与多Token预测
  • Python 常用内置函数详解(八):对象属性操作getattr()、setattr()、delattr()、hasattr()、vars()函数详解
  • ​基于51单片机的数字温度计—可显示负数
  • esp32cam开发板的引脚使用和测试
  • 《跨越边界:探索跨端框架中通用状态管理方案设计》
  • 数据库Mysql_约束
  • 响应式布局,在飞帆平台中如此简单
  • 红利底波是什么意思?
  • LegalOne:本土与国际视野融合的法律评级,大湾区律师及律师事务所榜单申报启动
  • 使用CubeMX新建DMA工程——存储器到外设模式
  • 梳理顶会论文相关的经验贴
  • L3-040 人生就像一场旅行
  • 目标文件的段结构及核心组件详解
  • C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 17)