神经网络的计算量(FLOPs)、参数量(Params)、推理时间(FPS)的定义及实现方法

2023-10-28

目录

1. 定义

2. 实现方法

2.1. 计算参数量

2.2. 计算参数量和FLOPs

2.3. 计算推理时间(FPS)

3. 数据大小对参数量和FLOPs的影响

4. 参数量和FLOPs对于硬件要求

参考


1. 定义

在评价深度学习模型的大小、计算量、推理时间,经常使用的参数有:parameters, FLOPs,FPS, MACs, MAdds。除此以外,我们还经常见到MAC, FLOPS, GFLOPS, TFLOPS等,其中,后三个参数其实并非用来评价模型的计算量,而是用来评价计算机硬件的计算能力。下面分别介绍一下以上几个参数:

Params

参数量是指模型训练中需要训练的参数总数。用来衡量模型的大小(计算空间复杂度)。

FLOPs(Floating-point Operations)

浮点运算次数,理解为计算量(计算时间复杂度),可以用来衡量算法的复杂度,常用做神经网络模型速度的间接衡量标准(虽然最近已经有文章证明靠FLOPs间接标准评价模型的速度是不靠谱的,因为模型的计算速度还跟内存的吞吐等因素相关,但此标准依然广泛用作模型速度的参考评价标准)。一个乘法或一个加法都是一个FLOPs。

FPS(Frames Per Second):每秒传输帧数,网络每秒可以处理(检测)多少帧(多少张图片),即每秒内可以处理的图片数量或者处理一张图片所需时间来评估检测速度,时间越短,速度越快。FPS简单来理解就是图像的刷新频率,假设目标网络处理1帧要0.02s,此时FPS就是1/0.02=50。

MACs, MAdds(Multiply–Accumulate Operations)

乘加累积操作数,常常与FLOPs概念混淆,实际上1MACs包含一个乘法操作与一个加法操作,通常MACs与FLOPs存在一个2倍的关系。MACs和MAdds相同。

MAC(memory access cost)

内存使用量,用来评价模型在运行时的内存占用情况。

FLOPS(Floating-point Operations Per Second):

每秒浮点运算次数,理解为计算速度,是一个衡量硬件性能的指标。它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。正因为FLOPS字尾的那个S,代表秒,而不是复数,所以不能省略掉。在这里所谓的“浮点运算”,实际上包括了所有涉及小数的运算。这类运算在某类应用软件中常常出现,而它们也比整数运算更花时间。现今大部分的处理器中,都有一个专门用来处理浮点运算的“浮点运算器”(FPU)。也因此FLOPS所量测的,实际上就是FPU的执行速度。

GFLOPS (Giga Floating-point Operations Per Second)

即每秒10亿次的浮点运算数,常作为GPU性能参数但不一定代表GPU的实际表现,因为还要考虑具体如何拆分多边形和像素、以及纹理填充,理论上该数值越高越好。1GFlops = 1,000MFlops。

2. 实现方法

2.1. 计算参数量

model = torchvision.models.alexnet(pretrained=False)
# nelement():统计Tensor的元素个数
#.parameters():生成器,迭代的返回模型所有可学习的参数,生成Tensor类型的数据
total = sum([param.nelement() for param in model.parameters()])
print("Number of parameter: %.2fM" % (total/1e6))

2.2. 计算参数量和FLOPs

方法1:thop

安装 :

pip install thop

调用:

计算模型参数总量和模型计算量,而且会打印每一层网络的具体信息。

import torch
import torchvision
from thop import profile

print('==> Building model..')
model = torchvision.models.alexnet(pretrained=False)

input = torch.randn(1, 3, 224, 224)
flops, params = profile(model, (input,))
print('flops: %.2f M, params: %.2f M' % (flops / 1e6, params / 1e6))

方法2:ptflops

安装:

pip install ptflops

调用:

计算模型参数总量和模型计算量,而且会打印每一层网络的具体信息。

import torchvision
from ptflops import get_model_complexity_info

model = torchvision.models.alexnet(pretrained=False)
flops, params = get_model_complexity_info(model, (3, 224, 224), as_strings=True, print_per_layer_stat=True)
print('flops: ', flops, 'params: ', params)

方法3:torchstat

安装:

pip install torchstat

调用:计算模型参数总量和模型计算量,而且会打印每一层网络的具体信息。

import torch
import torchvision
from torchstat import stat

print('==> Building model..')
model = torchvision.models.alexnet(pretrained=False)


stat(model, (3, 224, 224))

2.3. 计算推理时间(FPS)

安装:

import time

调用:

torch.cuda.synchronize()
start = time.time()
result = model(img.to(device))
torch.cuda.synchronize()
end = time.time()
print('infer_time:', end-start)

3. 数据大小对参数量和FLOPs的影响

以thop法,为例:

import torch
import torchvision
from thop import profile

print('==> Building model..')
model = torchvision.models.alexnet(pretrained=False)

input = torch.randn(1, 3, 224, 224)
flops, params = profile(model, (input,))
print('flops: %.2f M, params: %.2f M' % (flops / 1e6, params / 1e6))
  • 输入数据:(1, 3, 224, 224),一张224*224的RGB图像,结果是:
flops: 714.21 M, params: 61.10 M
  •  输入数据:(2, 3, 224, 224),两张224*224的RGB图像,结果是:
flops: 1428.41 M, params: 61.10 M
  • 输入数据:(1, 3, 448, 448),一张448*448的RGB图像,结果是:
flops: 5665.76 M, params: 61.10 M

4. 参数量和FLOPs对于硬件要求

  • 计算量→GPU的运算能力
  • 参数量→显存大小

参考

深度学习中模型计算量(FLOPs)和参数量(Params)的理解以及四种计算方法总结https://blog.csdn.net/qq_40507857/article/details/118764782

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

神经网络的计算量(FLOPs)、参数量(Params)、推理时间(FPS)的定义及实现方法 的相关文章

  • STM32相关手册使用记录

    目录 一 概述 二 手册获取 2 1 芯片手册 2 2 库手册和官方DEMO 三 手册内容 3 1 数据手册 3 1 1 查看外设挂载哪条总线 3 2 参考手册 3 2 1 查看芯片flash页大小 最小存储单位 3 2 2 STM32G0
  • python中right是什么意思_Python turtle.right方法代码示例

    本文整理汇总了Python中turtle right方法的典型用法代码示例 如果您正苦于以下问题 Python turtle right方法的具体用法 Python turtle right怎么用 Python turtle right使用
  • Python绘图:使用subplots函数在matplotlib中创建子图并添加主标题

    Python绘图 使用subplots函数在matplotlib中创建子图并添加主标题 在数据可视化过程中 有时需要将多个图形并排展示以比较和分析数据 在Python的matplotlib库中 可以使用subplots函数创建包含多个子图的
  • 【定位导航算法】粒子滤波基础认识

    粒子滤波基础认识 粒子滤波粒子核心思想 粒子滤波步骤 粒子滤波的优缺点 粒子滤波常用方法 马尔科夫模型 粒子滤波粒子核心思想 基于贝叶斯概率 随机采样 重要采样进行估算 关键 重要性密度函数的选择 粒子滤波步骤 根据初始化状态变量 gt 生
  • 判断主机操作系统的三种方法

    方法1 14分 通过更改URL大小写判断 服务器是linux还是winds 方法2 15分 可以通过TTL判断操作系统是linux还是windows https blog csdn net woshiwumingshi1 article d

随机推荐

  • Reference to '*****' is ambiguous;之类的问题解决

    造成这个问题的原因是 在一个以上的命名空间内被定义 使得有多个 同时满足 系统不知具体使用哪一个 如boost和std中都定义了function函数类型模板 如果在程序开头 同时使用using namespace std 和 using n
  • C++逐行解析Txt文本文件,并将相应的字符串转换为double等类型

    直接上代码 ReadTxt cpp 此文件包含 main 函数 程序执行将在此处开始并结束 include
  • 正则表达式匹配IPv4,IPv6

    简单学习了一下正则表达式 感觉IPv4 IPv6匹配挺实用的 记录一下 IPv4 25 0 5 2 0 4 d 1 d 2 1 9 d 3 25 0 5 2 0 4 d 1 d 2 1 9 d String IPv4Regex 25 0 5
  • 函数调用栈——初探!

    好些日子以前 我接触了Java 当时碰到一个问题 方法调用栈 当时不太明白 直到前段时间学了 数据结构 中的 栈 才略微的明白了一些 先将这个曾经不懂的地方总结一下 首先 必须对 栈 这种结构的特性有所了解 栈的特性 后进先出 在程序中 调
  • 万字超详细解析!Spring之基于注解的声明式事务

    14 1 概述 14 1 1 编程式事务 事务功能的相关操作全部通过自己编写代码来实现 Connection conn try 开启事务 关闭事务的自动提交 conn setAutoCommit false 核心操作 提交事务 conn c
  • iOS 16适配

    IDE环境相关升级 Xcode 14 0 macOS 12 4 Xcode 14 Beta 3 传送门 https developer apple com services account download path Developer T
  • Elasticsearch新手入门教程(已经是最简洁版)

    1 配置JDK环境 建议1 7以上 2 官网下载ES https www elastic co cn 3 解压启动 用dos命令进入压缩包里面 这里可修改端口 补充 插件使用 这里使用的elasticsearch head master 插
  • win10+wsl2+ubuntu+zsh+Powerlevel10k+nerd fonts

    wsl2 是适用于 linux 的 windows 子系统的新版本 是相对于 wsl1 的升级 简单理解就是 wsl2 是可以在 windows 下进行 linux 开发 在我开来 wsl2 和虚拟机没什么区别 wsl2 就是一个交互性优化
  • 信息收集----谷歌语句

    信息收集的方式可以分为两种 主动和被动 主动的信息收集方式 通过直接访问 扫描网站 这种将流量流经网站的行为 被动的信息收集方式 利用第三方的服务对目标进行访问了解 比如 Google搜索 通过搜索引擎 有时会给我们带来意想不到的效果 下面
  • thinkphp5 切换多语言

    请求时候 1 header中增加 Accept Language 语言 2 在请求地址中增加 lang 语言参数
  • python--unittest单元测试框架

    1 简介 unittest单元测试框架是受到 JUnit JAVA 的启发 与其他语言中的主流单元测试框架有着相似的风格 其支持测试自动化 配置共享代码测试 支持将测试样例聚合到测试集中 并将测试与报告框架独立 2 构成 静态类图 2 1
  • ajax发生错误,Ajax犯的错误处理方法

    1 ajax 发送请求时状态判断 if else 语句问题 var xhr new XMLHttpRequest xhr open get strUrl xhr onreadystatechange function if xhr read
  • 时序分析/约束(一):相关概念

    由 zme 于 星期四 02 20 2014 15 03 发表 http xilinx eetrend com blog 6631 时序分析时FPGA设计中永恒的话题 也是FPGA开发人员设计进阶的必由之路 慢慢来 先介绍时序分析中的一些基
  • uniapp 登入功能 vuex使用 通俗易懂

    目录 功能介绍 运行效果 未登入状态 登入页面 进行登入完后 代码演示 功能结构 请求封装 详细文章 部分api ts 关于 用户登入接口 store index ts store user ts main js App vue type
  • 2018-12-12 Pycharm git clone 密码错误

    在新建工程的时候选择了 clone from git 不小心把密码输错了 再次clone 不再提示输入密码 只提示错误 微信截图 20181212003707 png 进入 windows 凭据 点击下三角 删除即可 微信截图 201812
  • nodejs express multer 中文名乱码

    找了半天找不到 科学上网出去秒解决 哎 无力吐槽 不bb那么多 直接上代码 上传时前端正常 但是后端接收文件时乱码 const uploads multer 文件上传的位置 dest path join dirname public upl
  • Java中字符串与byte数组之间的转换方法

    在Java编程中 我们常常需要对字符串和byte数组进行转换 字符串一般是用来表示文本信息 而byte数组则是用来表示二进制数据 如图片 音频等 本文将详细介绍Java中字符串和byte数组之间的转换方法 包括将字符串转换为byte数组和将
  • Failed to find Build Tools revision 27.0.3

    因为电脑系统的问题 导致运行一下Android Studio整个8G的电脑内存都给吃没了 索性又重装了下电脑 重新安装了下Android Studio 错误信息 11 44 Gradle sync failed Failed to find
  • @Value值注入及配置文件组件扫描方式

    spring配置文件对应的是父容器 springMVC配置文件产生的是子容器 前者一般配置数据源 事务 注解等 当然还可以进一步将一些配置细化到其他xml中 后者一般配置控制层相关的 如静态资源 视图解析器等 系统启动的时候 先初始化父容器
  • 神经网络的计算量(FLOPs)、参数量(Params)、推理时间(FPS)的定义及实现方法

    目录 1 定义 2 实现方法 2 1 计算参数量 2 2 计算参数量和FLOPs 2 3 计算推理时间 FPS 3 数据大小对参数量和FLOPs的影响 4 参数量和FLOPs对于硬件要求 参考 1 定义 在评价深度学习模型的大小 计算量 推