关于 FLOPS、FLOPs、参数量的相关计算

  • 一、FLOPS
  • 二、FLOPs
    • 2.1 2D 卷积运算
      • FLOPs
      • Parameters
    • 2.2 全连接层
      • FLOPs
      • Parameters
    • 2.3 BatchNorm2D 层
      • FLOPs
      • Parameters
    • 2.4 激活层
  • 三、Github 自动计算 Parameters、MACs 的工具
    • 3.1 thop
    • 3.2 ptflops
    • 3.3 其他
  • 四、尚未完结,需要时再补充~

写在前面
  最近找到一些计算FLOPs的文章,奈何全是水文,讲都讲不清楚,完完全全的究极缝合怪。因此,这里准备彻底搞懂。

参考:CNN 模型所需的计算力(flops)和参数(parameters)数量是怎么计算的?

一、FLOPS

  FLOPS:全称:FLoating point Operations Per Second的缩写,即每秒浮点运算次数,或表示为计算速度。是一个衡量硬件性能的指标。通俗点讲 显卡算力,对应英伟达官网的那些:GPU算力排行榜。

二、FLOPs

  这才是本文的重点,FLOPs:FLoating point OPerationS 即 浮点计算次数,包含乘法和加法,只和模型有关,可以用来衡量其复杂度。多提一嘴,论文里面的FLOPs有的计算也并不明确,包括很多 Github 开源代码里面采用的 MACs,也就是考虑一次乘+加法运算为一次 MAC,粗略换算的话:FLOPs=2×MAC\text{FLOPs} = 2\times\text{MAC}FLOPs=2×MAC。建议发表的论文还是按照 FLOPs 来给出,因为我看的大部分文章都是用的这个,而不是 MACs。

2.1 2D 卷积运算

FLOPs

就单纯的 2D 卷积而言,举例:

Conv2d(Cout,Cin,kernel=K,stride=S,padding=P,bias=False)\text{Conv2d}(C_{out}, C_{in}, kernel= K, stride= S, padding= P, bias=False)Conv2d(Cout​,Cin​,kernel=K,stride=S,padding=P,bias=False)
输入 Feature map:(B,Cin,Win,Hin)(B, C_{in}, W_{in}, H_{in})(B,Cin​,Win​,Hin​),输出 Feature map:(B,Cout,Wout,Hout)(B, C_{out}, W_{out}, H_{out})(B,Cout​,Wout​,Hout​),计算如下:
FLOPs=(2×Cin×K2−1)×Wout×Hout×Cout\text{FLOPs}=\left(2\times{C_{in}}\times{K}^2-1\right)\times{W_{out}}\times{H_{out}}\times{C_{out}}FLOPs=(2×Cin​×K2−1)×Wout​×Hout​×Cout​
注意 (.) 里面的 -1 ,如果 bias = True,则不需要 -1。将 (.) 拆分为 乘法和加法:
FLOPs=[(Cin×K2)+(Cin×K2−1)]×Wout×Hout×Cout\text{FLOPs}=\left[\left({C_{in}}\times{K}^2\right)+\left({C_{in}}\times{K}^2-1\right)\right]\times{W_{out}}\times{H_{out}}\times{C_{out}}FLOPs=[(Cin​×K2)+(Cin​×K2−1)]×Wout​×Hout​×Cout​
第一个 (.) 里面是乘法,第二个是加法,如果 n 个数相加,做 n - 1 次加法运算,因此当 bias = True 时,刚好和 -1 抵消掉。

Parameters

  参数量的计算要简单些:Paras=K×K×Cin×Cout+Cout\text{Paras}=K\times{K}\times{C_{in}}\times{C_{out}}+C_{out}Paras=K×K×Cin​×Cout​+Cout​
同样注意:如果 bias = True,+Cout+C_{out}+Cout​,如果 bias = False,去掉 +Cout+C_{out}+Cout​。

2.2 全连接层

FLOPs

线性全连接层,举例:
Liner(Cin,Cout,bias=False)Liner(C_{in}, C_{out}, bias = False)Liner(Cin​,Cout​,bias=False),输入 sequence :(B,num,Cin)(B, num, C_{in})(B,num,Cin​),输出 sequence:(B,num,Cout)(B, num, C_{out})(B,num,Cout​),计算如下:
$FLOPs=(2×Cin−1)×Cout\text{FLOPs}=\left(2\times{C_{in}}-1\right)\times{C_{out}}FLOPs=(2×Cin​−1)×Cout​
其中 222 代表乘法和加法。同上,当 bias = False 时,-1,bias = True时,无 -1。

Parameters

全连接层参数:Paras=Cin×Cout+Cout\text{Paras}={C_{in}}\times{C_{out}}+C_{out}Paras=Cin​×Cout​+Cout​
同样注意:当 bias = True,+Cout+C_{out}+Cout​,当 bias = False,去掉 +Cout+C_{out}+Cout​。

2.3 BatchNorm2D 层

FLOPs

由于 BatchNorm2D 层经常和卷积层连用,参考:论文阅读笔记:看完也许能进一步了解Batch Normalization,而在程序里面,这两个可以合并运算,因此不会增加 FLOPs。当然如果是 BatchNorm2D 在前,卷积在后,通用需要考虑 BatchNorm2D 层。

Parameters

对于每一个通道来说,可学习的参数有 2 个,动量 γ\gammaγ、动量偏移 β\betaβ。

2.4 激活层

  对于 ReLU 来说,由于其本身性质,不涉及 MAC 运算,因此只考虑 FLOPs。而FLOPs 相对来说较小,所以一般不计算或者想其他办法计算。提一嘴,在推理时哪会用得到sigmoid呢。
激活层没有参数。

三、Github 自动计算 Parameters、MACs 的工具

3.1 thop

官网:Github
安装:

pip install thop

使用举例:

from torchvision.models import resnet50
from thop import profile
model = resnet50()
flops, params = profile(model, input_size=(2, 3, 200,280))
print("FLOPs=", str(flops / 1e9) + '{}'.format("G"))
print("FLOPs=", str(flops / 1e6) + '{}'.format("M"))

自定义计算规则举例:

from thop import profile
class YourModule(nn.Module): # 自定义模型
def count_your_model(model, x, y):  # 自定义计算规则flops, params = profile(model, input_size=(2, 3, 200,280),
custom_ops={YourModule: count_your_model})
print("FLOPs=", str(flops / 1e9) + '{}'.format("G"))
print("FLOPs=", str(flops / 1e6) + '{}'.format("M"))

优点:对于某个层的调试来说,很方便,比如 nn.Conv2D。
缺点:自定义的层,如 nn.Sequential()、nn.ModuleList() 这些容器层计算不了,需要自定义规则。

3.2 ptflops

官网:Github
安装:

pip install ptflops

使用举例:

import torch
from torchvision.models import resnet50
from ptflops import get_model_complexity_infomodel = resnet50()
macs, params = get_model_complexity_info(model, (3, 200, 280), as_strings=True,print_per_layer_stat=True, verbose=True)
print("FLOPs=", str(flops / 1e9) + '{}'.format("G"))
print("FLOPs=", str(flops / 1e6) + '{}'.format("M"))

优点:对于某个层的调试来说,很方便,比如 nn.Conv2D这些。另外 print_per_layer_stat = True 可以打印每一层的结构
缺点:自定义的层,如 nn.Sequential()、nn.ModuleList() 这些容器层计算不了。另外输入没有 batch维度,给出 shape 即可。

3.3 其他

  还有一些其他的库,基本上和上面两种差不多,但缺点也很明显,自己写的卷积层可能压根计算不了。
  举例:Github

四、尚未完结,需要时再补充~

写在后面
  CSDN 灌水的人太多了,关键很多是错的,无语~~

关于 FLOPS、FLOPs、参数量的相关计算相关推荐

  1. 卷积层计算量(FLOPS)和参数量的计算

    1.卷积参数量的计算,若卷积层的输入featuremap的维度为Cin×Hin×Win,卷积核的大小为K1×K2, padding=P1×P2, stride=S1×S2,卷积核(filter)的数量 ...

  2. 【读点论文】A ConvNet for the 2020s,结合swin transformer的结构设计和训练技巧调整resnet网络,在类似的FLOPs和参数量取得更好一点的效果

    A ConvNet for the 2020s Abstract 视觉识别的"咆哮的20年代"始于视觉transformer(ViTs)的问世,它迅速取代ConvNets成为最先进 ...

  3. YOLOv5首发改进最新CVPR2023主干FasterNet系列:实测私有数据集mAP有效涨点,同时降低参数量|为更快的神经网络追求更高的 FLOPS,参数量下降,超越其他轻量化模型

  4. 关于Resnet50和ResNeXt50的参数量的简单计算(只考虑卷积层和全连接层)

    主要是我想知道ResNeXt50按cardinality方式每组是不是共享了参数? 参考一张图:https://www.zhihu.com/question/323424817 上面已经写了Resne ...

  5. Lesson 16.1016.1116.1216.13 卷积层的参数量计算,1x1卷积核分组卷积与深度可分离卷积全连接层 nn.Sequential全局平均池化,NiN网络复现

    二 架构对参数量/计算量的影响 在自建架构的时候,除了模型效果之外,我们还需要关注模型整体的计算效率.深度学习模型天生就需要大量数据进行训练,因此每次训练中的参数量和计算量就格外关键,因此在设计卷积网 ...

  6. 深度学习中参数量与计算量的理解

    接下来要分别概述以下内容: 1 首先什么是参数量,什么是计算量 2 如何计算 参数量,如何统计 计算量 3 换算参数量,把他换算成我们常用的单位,比如:mb 4 对于各个经典网络,论述他们是计算量大还 ...

  7. pytorch_lesson16.2 架构对学习/鲁棒性的影响(VGG16复现+感受野+平移不变性)+架构对参数量的影响(1*1卷积核+分组卷积与深度分离卷积+NiN网络复现)

    提示:仅仅是学习记录笔记,搬运了学习课程的ppt内容,本意不是抄袭!望大家不要误解!纯属学习记录笔记!!!!!! 文章目录 前言 一.架构对学习能力/鲁棒性的影响 1 深度 1.1 困难与实践 1.2 ...

  8. CNN模型复杂度(FLOPs、MAC)、参数量与运行速度

    CNN模型复杂度(FLOPs.MAC).参数量与运行速度 先转载一下,有空再来整理 文章目录 0. 模型复杂度简介 1. 模型复杂度之一:模型参数量的计算方法 卷积层参数量计算 全连接层参数量计算 2 ...

  9. 深度学习模型参数量/计算量和推理速度计算

    作者|龟壳 来源 | 知乎 地址 | https://zhuanlan.zhihu.com/p/376925457 本文仅作学术分享,若侵权请联系后台删文处理 本文总结了一些关于模型参数量计算以及推理 ...

最新文章

  1. 神秘围棋AI“神之一手”:5秒一步令日本高手叹服
  2. 黑客技术的网站(❤️可以自学,建议收藏❤️)
  3. 在MonoTouch中正确而简单的使用 Sqlite 数据库
  4. 你不知道的 Chrome DevTools 玩法
  5. spring boot maven项目返回值乱码的解决方法
  6. java rabbitmq 并发_RabbitMQ消息中间件 高级篇二 高并发情况下保障消息投递可靠性...
  7. mysql的事务日志_MySQL 事务日志
  8. 余额表前后台操作和对应sql
  9. 一般纳税人税额计算_一般纳税人应纳税额如何计算?
  10. css和scss设置子元素样式
  11. 【STM32】开发板学习1 NUCLEO-L476RG:GPIO例程 点亮LED2灯
  12. 《筑墙——只需一点点安全常识就能阻止网络犯罪》
  13. FastJson是如何导致App Crash的
  14. 在线ddl变更工具​ gh-ost
  15. CAM和GradCAM
  16. 在练琴时关于音乐与计算机结合的碎思考
  17. 局域网怎么查看单位摄像头_简单易用,夜里看的更清楚,360新品水滴摄像头夜视版实测...
  18. 圆满落幕!回顾 eBPF 技术的发展与挑战
  19. 视频教程-系统集成项目管理工程师考试历年真题讲解-软考
  20. oracle 导出secquence,oracle等待事件7——事務上的等待事件

热门文章

  1. 抛弃 moment.js,基于 date-fns 封装日期相关 utils
  2. Discuz!NT论坛与RTX集成
  3. 对不起,你拨打的用户已结婚
  4. DataGridView 选中行
  5. tf.one_hot()使用
  6. UITableViewCell单元格的删除、插入、移动
  7. 程序员Geek资源(工具/网站)
  8. 【Android】mitmproxy-ca-cert.pem手机证书文件安装
  9. Python实现不同交互界面跳转(创建子界面)
  10. sql查询一段时间(日期)的数据