如何计算模型的复杂度(参数量,FLOPs)

参考

如何计算神经网络模型的复杂度
深度学习卷积、全连接层、深度可分离层参数量和FLOPs计算公式

概念

  1. Params:模型的参数量。(空间复杂度
  2. FLOPs:FLoating point Operations,前向推理的计算量。(时间复杂度
  3. MAC:Memory Access Cost。基本上看每个计算输出结果 C o u t × H o u t × W o u t C_{out} \times H_{out} \times W_{out} Cout×Hout×Wout 相加的总和。
  4. MACC(MADD):multiply-accumulate operations:先乘起来再加起来的运算次数。 也就是 乘加 看做一次运算。
    所以 1个 MACC = 2个 FLOPs。
  5. 内存量

H i n H_{in} Hin: 输入的 height
W i n W_{in} Win: 输入的 width
H o u t H_{out} Hout: 输出的 height
W o u t W_{out} Wout: 输入的 width
K K K: 卷积核size
C i n C_{in} Cin: 输入的channel 数
C o u t C_{out} Cout: 输出的 channel数

参数量计算

全连接层

在这里插入图片描述

卷积层

普通卷积: 输入尺寸 C i ∗ H i ∗ W i C_i * H_i * W_i CiHiWi, 卷积核的大小为 K ∗ K K*K KK, 输出的尺寸大小为 C o ∗ H o ∗ W o C_o * H_o * W_o CoHoWo.

  • 不考虑 bias
    K 2 × C i × C o K^2 \times C_{i} \times C_{o} K2×Ci×Co
  • 考虑bias
    ( K 2 × C i + 1 ) × C o (K^2 \times C_{i} + 1) \times C_{o} (K2×Ci+1)×Co

池化层

对于池化层而言,常用的Max-pooling,Avg-pooling等是不存在参数量的。

batch norm

每个 batch 减均值,除方差。
再根据参数 α \alpha α, β \beta β 做缩放
在训练时计算的均值方差是直接计算,在预测时是用 running mean,running var.
在这里插入图片描述
所以参数量是?2HW*C, 错了, 是
2 × C i 2 \times C_{i} 2×Ci

激活函数

无参数

FLOPs

卷积层

  • 不考虑 bias
    ( 2 × ( K 2 × C i ) − 1 ) × ( C o × H o × W o ) (2\times (K^2 \times C_{i} ) -1 ) \times (C_{o} \times H_{o} \times W_{o}) (2×(K2×Ci)1)×(Co×Ho×Wo)

先计算输出的feature中一个元素需要的计算量。 ( K 2 × C i ) (K^2 \times C_{i} ) (K2×Ci) 表示乘法次数, ( K 2 × C i ) − 1 (K^2 \times C_{i} ) -1 (K2×Ci)1 表示加法次数。

  • 考虑bias
    带bias 的计算(一部分是乘法,一部分是加法)
    2 × ( K 2 × C i ) × ( C o × H o × W o ) 2\times (K^2 \times C_{i} ) \times (C_{o} \times H_{o} \times W_{o}) 2×(K2×Ci)×(Co×Ho×Wo)

全连接层

输入维度 C i C_i Ci, 输出 C o C_o Co. 全连接层就理解为一个矩阵,矩阵行数,矩阵列数,如考虑bias,则先计算输出向量中一个元素需要多少计算量,首先要做 C i C_i Ci 次乘法,然后做 C i − 1 C_i -1 Ci1 次加法。若考虑 bias,则做的加法会多一次。

  • 不考虑 bias : ( 2 N i n − 1 ) N o u t (2N_{in}-1)N_{out} (2Nin1)Nout
    N i n N o u t N_{in}N_{out} NinNout 为乘法的运算量,
    ( N i n − 1 ) N o u t (N_{in} - 1)N_{out} (Nin1)Nout为加法的运算量
  • 考虑 bias : ( 2 N i n ) N o u t (2N_{in})N_{out} (2Nin)Nout

工具

torchinfo
mmdetection 工具代码

在这里插入图片描述

More

https://github.com/sovrasov/flops-counter.pytorch
https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/cnn/utils/flops_counter.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/367558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Loadbalancer如何优雅分担服务负荷

欢迎来到我的博客,代码的世界里,每一行都是一个故事 Loadbalancer如何优雅分担服务负荷 前言Loadbalancer基础:数字世界的分配大师1. 分发请求:2. 健康检查:3. 会话保持:4. 可伸缩性:5. 负载均衡…

hivesql的基础知识点

目录 一、各数据类型的基础知识点 1.1 数值类型 整数 小数 float double(常用) decimal(针对高精度) 1.2 日期类型 date datetime timestamp time year 1.3 字符串类型 char varchar / varchar2 blob /text tinyblob / tinytext mediumblob / mediumtext lon…

2024年美国大学生数学建模竞赛(F题)减少非法野生动物贸易|ABM/神经网络建模解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长,就读于上海交通大学,截至目前已经帮200人完成了建模与思路的构建的处理了~ 本篇文章是鹿鹿学长经过深度思考,独辟蹊径,通过Agent-Based Modeling解决非法野生动植物贸易问题。结合神经网络、集成学习、贝…

前端工程化之:webpack1-13(内置插件)

目录 一、内置插件 1.DefinePlugin 2.BannerPlugin 3.ProvidePlugin 一、内置插件 所有的 webpack 内置插件都作为 webpack 的静态属性存在的,使用下面的方式即可创建一个插件对象: const webpack require("webpack")new webpack.插件…

影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)

电影院订票选座小程序目录 目录 基于微信小程序的电影院购票系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能实现 2、管理员功能实现 (1)影院信息管理 (2)电影信息管理 (3)已…

电源芯片并联使用-AMS1117

自记: 电源芯片可不可以并联使用: 1.按照正规大厂Rohm的技术文档介绍,直接并联的两个LDO,只要其输出电压有很小的差异,就会造成电流分配的很大差异。 至于你长期使用没有发现问题,那可能是总电流的余量留…

蓝桥杯---煤球数目

有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 代码 pu…

Ingress

文章目录 环境准备什么是 Ingress认识 Ingress 资源Ingress 控制器(controller)Ingress 规则pathType 路径类型多重匹配Ingress 类TLS生成证书创建密钥 环境准备 下面的 yaml 文件内容,是使用 sts 创建两个 web 服务,并配置对应的 servcie。web 服务的首…

【JavaScript】前端攻击

前端攻击 1. CSRF的基本概念、缩写、全称 CSRF(Cross-site request forgery):跨站请求伪造。 从上图可以看出,要完成一次CSRF攻击,受害者必须满足两个必要的条件: 登录受信任网站A,并在本地生…

【疑问】为什么声明和定义要分离

前言 我们在学习的时候接触过一个话:编写自定义函数的时候 要做到声明和定义分离 那么为什么呢 今天就来简单的了解一下 疑问:错误的发生 下面给出两个源文件和一个头文件以及报错信息 text.cc文件 #include"head.h"int main() {int a 1…

深入理解指针(3)

⽬录 1. 字符指针变量 2. 数组指针变量 3. ⼆维数组传参的本质 4. 函数指针变量 5. 函数指针数组 6. 转移表 1. 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; ⼀般使⽤: int main() {char ch w;char *pc &ch;*pc w;return 0; } 还有…

C++类和对象入门(二)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、类的作用域 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要…

云服务器安全组、防火墙、端口问题,结合telnet解决项目部署无法访问

无论是运维还是后台亲自操刀在云服务器上部署项目,往往会遇到项目部署上去了,也确定项目正常运行,但还是没法访问的问题。 如果没有经验的小伙伴,很容易陷入疑惑的状态,无从下手解决。 其实这涉及到云平台安全组、服…

idea创建sping项目

一、环境 window10 IDEA 2022.2.3 maven-3.8.6 二、创建sping项目 1、新建Maven项目 File -> New -> Project 然后如下图选中Maven Archetype,在Archetype,选中maven-archetype-webapp,点击Create 2、配置maven 默认是使用IDEA内置…

《Pandas 简易速速上手小册》第9章:Pandas 数据可视化(2024 最新版)

文章目录 9.1 Pandas 内置可视化工具9.1.1 基础知识9.1.2 重点案例:销售数据分析9.1.3 拓展案例一:产品评价统计9.1.4 拓展案例二:员工满意度分布 9.2 与 Matplotlib 和 Seaborn 集成9.2.1 基础知识9.2.2 重点案例:销售趋势分析9.…

性能测试常用术语

之前在性能测试过程中,对于某些其中的术语一知半解,导致踩了很多坑。这篇博客,就常见的一些性能测试术语进行一次浅析。。。 负载 对被测系统不断施加压力,直到性能指标超过预期或某项资源使用达到饱和,以验证系统的处…

Linux Zip解压缩命令

Zip 用法 $ zip [-选项] [-b 路径] [-t 日期] [-n 后缀名] [压缩文件列表] [-xi 列表] 默认操作是添加或替换压缩文件列表中的压缩文件条目,压缩文件列表可以包括特殊名称 -,压缩标准输入数据 Zip 是一个创建和管理 zip 文件的压缩工具 Unzip 是一个用…

关于java的异常处理

关于java的异常处理 我们在上一篇文章中,对java中的异常有了一个初步的了解,本篇文章我们来了解一下异常的处理机制,如何抛出异常,如何捕捉异常😀 关于java的异常 一、异常类型等级 二、关键字 trycatchfinallythr…

Opencv——图片卷积

图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二…