转自:pytorch计算FLOPs - 简书

1. 引言

  • 其实模型的参数量好算,但浮点运算数并不好确定,我们一般也就根据参数量直接估计计算量了。但是像卷积之类的运算,它的参数量比较小,但是运算量非常大,它是一种计算密集型的操作。反观全连接结构,它的参数量非常多,但运算量并没有显得那么大。
  • 此外,机器学习还有很多结构没有参数但存在计算,例如最大池化和Dropout等。因此,PyTorch-OpCounter 这种能直接统计 FLOPs 的工具还是非常有吸引力的。
  • PyTorch-OpCounter GitHub 地址:https://github.com/Lyken17/pytorch-OpCounter

2. OpCouter

  • PyTorch-OpCounter 的安装和使用都非常简单,并且还能定制化统计规则,因此那些特殊的运算也能自定义地统计进去。
  • 我们可以使用 pip 简单地完成安装:pip install thop。不过 GitHub 上的代码总是最新的,因此也可以从 GitHub 上的脚本安装。
  • 对于 torchvision 中自带的模型,Flops 统计通过以下几行代码就能完成:
from torchvision.models import resnet50
from thop import profilemodel = resnet50()
input = torch.randn(1, 3, 224, 224)
flops, params = profile(model, inputs=(input, ))
  • 我们测试了一下 DenseNet-121,用 OpCouter 统计了参数量与运算量。API 的输出如下所示,它会告诉我们具体统计了哪些结构,它们的配置又是什么样的。
  • 最后输出的浮点运算数和参数量分别为如下所示,换算一下就能知道 DenseNet-121 的参数量约有 798 万,计算量约有 2.91 GFLOPs。
flops: 2914598912.0
parameters: 7978856.0

3. OpCouter 是怎么算的

  • 我们可能会疑惑,OpCouter 到底是怎么统计的浮点运算数。其实它的统计代码在项目中也非常可读,从代码上看,目前该工具主要统计了视觉方面的运算,包括各种卷积、激活函数、池化、批归一化等。例如最常见的二维卷积运算,它的统计代码如下所示:

def count_conv2d(m, x, y):x = x[0]cin = m.in_channelscout = m.out_channelskh, kw = m.kernel_sizebatch_size = x.size()[0]out_h = y.size(2)out_w = y.size(3)# ops per output element# kernel_mul = kh * kw * cin# kernel_add = kh * kw * cin - 1kernel_ops = multiply_adds * kh * kwbias_ops = 1 if m.bias is not None else 0ops_per_element = kernel_ops + bias_ops# total ops# num_out_elements = y.numel()output_elements = batch_size * out_w * out_h * couttotal_ops = output_elements * ops_per_element * cin // m.groupsm.total_ops = torch.Tensor([int(total_ops)])
  • 总体而言,模型会计算每一个卷积核发生的乘加运算数,再推广到整个卷积层级的总乘加运

作者:顾北向南
链接:https://www.jianshu.com/p/88c13fcf68ba
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

pytorch计算FLOPs相关推荐

  1. PyTorch中FLOPs计算问题

    最近看了很多关于FLOPs计算的实现方法,也自己尝试了一些方法,发现最好用的还是PyTorch中的thop库(代码如下): device = torch.device("cuda" ...

  2. pytorch计算模型参数量

    1. 安装 thop 1.1 常规安装 pip install thop 1.2 若上述安装方式错误,可以参考以下方式: pip install thop-i http://pypi.douban.c ...

  3. Pytorch计算神经网络的参数量和浮点操作数

    参考链接:https://github.com/ShichenLiu/CondenseNet/blob/master/utils.py 计算参数量 遍历模型的参数,并提取参数的维度: def get_ ...

  4. pytorch 计算相似度,相关系数

    torch.cosine_similarity 可以对两个向量或者张量计算相似度 结果:可能为负数,只能判断方向,相似度精度比较低. 比如1和10000的相似度为1,1和-1的相似度为-1. impo ...

  5. tensorflow2计算flops

    TensorFlow2不使用第三方库计算flops,本人python3.9,TensorFlow2.5 代码如下(示例): import tensorflow as tf from tensorflo ...

  6. Tensor flow计算Flops

    Tensorflow计算Flops: run_meta = tf.compat.v1.RunMetadata() opts = tf.compat.v1.profiler.ProfileOptionB ...

  7. pytorch——计算两个等大无序点云中的距离Earth Mover Distance

    目前要做两个无序点集之间的相似性计算,在看过Chamfer Distance后,个人觉得CD的计算方式决定了其无法处理两个点集整体分布差异大,但是局部有部分点距离很近的情况,而这种情况在点集中是一定可 ...

  8. pytorch计算余弦相似度

    在pytorch中,可以使用torch.cosine_similarity函数对两个向量或者张量计算余弦相似度.先看一下pytorch源码对该函数的定义: class CosineSimilarity ...

  9. 计算FLOPs和param

    概念 网络中的参数量(param)对应与空间Space概念,及空间复杂度. 浮点计算量(FLOPs)对应与时间Time概念,对应于时间复杂度. 如何计算网络中的参数量(param) 网络中的参数量(p ...

最新文章

  1. ESI世界大学排名:371所内地高校上榜!
  2. linux stress 命令 模拟系统高负载
  3. 安装 m2eclipse 插件
  4. StyleAI:印象坐标-感情色彩量化/感情近邻关系
  5. 其他平台上测试工具的使用
  6. 漫画:如何破解MD5算法
  7. Python 元组(Tuple)操作详解
  8. select查询语句执行顺序
  9. centOS7挂在windows移动硬盘方法
  10. 案例:实现商品分类导航栏
  11. 2学习率调整_Keras的Adam优化器参数理解及自适应学习率
  12. 一个三年Java程序员的面试总结!
  13. php修改另一个文件内容,php如何修改文件内容
  14. 为什么Linux红帽认证能经久不衰?
  15. Face photo recognition using sketch (人脸画像合成)
  16. 一步步教您搞定讯飞语音识别 | 寻找C站宝藏
  17. 中国正式进入 5G 商用元年!
  18. 一个人在家怎么赚钱?普通人如何通过网络实现在家就能赚钱
  19. 商业计划汇报PPT模板
  20. 提供优质客户服务的5种方法

热门文章

  1. You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).Please, commit your changes
  2. 数值计算 - Richardson外推法求一阶导数(C++实现)
  3. 徐鹤宁语录【销售篇】
  4. python 网页生成pdf_3个步骤教你如何用Python实现网页转PDF
  5. 基于 Node.js + Koa 构建完整的 Web API (配置 ESLint 和使用 Airbnb 编码规范)
  6. 斐波纳契数列 python123
  7. 面试吹牛B,入职就倒霉了
  8. 2022-2027年中国共享自行车行业发展监测及投资战略研究报告
  9. JS中的运算符号(加号)
  10. mysql中约束由数字构成_MySQL 数据类型和约束(外键是重点)