pytorch计算FLOPs
转自: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相关推荐
- PyTorch中FLOPs计算问题
最近看了很多关于FLOPs计算的实现方法,也自己尝试了一些方法,发现最好用的还是PyTorch中的thop库(代码如下): device = torch.device("cuda" ...
- pytorch计算模型参数量
1. 安装 thop 1.1 常规安装 pip install thop 1.2 若上述安装方式错误,可以参考以下方式: pip install thop-i http://pypi.douban.c ...
- Pytorch计算神经网络的参数量和浮点操作数
参考链接:https://github.com/ShichenLiu/CondenseNet/blob/master/utils.py 计算参数量 遍历模型的参数,并提取参数的维度: def get_ ...
- pytorch 计算相似度,相关系数
torch.cosine_similarity 可以对两个向量或者张量计算相似度 结果:可能为负数,只能判断方向,相似度精度比较低. 比如1和10000的相似度为1,1和-1的相似度为-1. impo ...
- tensorflow2计算flops
TensorFlow2不使用第三方库计算flops,本人python3.9,TensorFlow2.5 代码如下(示例): import tensorflow as tf from tensorflo ...
- Tensor flow计算Flops
Tensorflow计算Flops: run_meta = tf.compat.v1.RunMetadata() opts = tf.compat.v1.profiler.ProfileOptionB ...
- pytorch——计算两个等大无序点云中的距离Earth Mover Distance
目前要做两个无序点集之间的相似性计算,在看过Chamfer Distance后,个人觉得CD的计算方式决定了其无法处理两个点集整体分布差异大,但是局部有部分点距离很近的情况,而这种情况在点集中是一定可 ...
- pytorch计算余弦相似度
在pytorch中,可以使用torch.cosine_similarity函数对两个向量或者张量计算余弦相似度.先看一下pytorch源码对该函数的定义: class CosineSimilarity ...
- 计算FLOPs和param
概念 网络中的参数量(param)对应与空间Space概念,及空间复杂度. 浮点计算量(FLOPs)对应与时间Time概念,对应于时间复杂度. 如何计算网络中的参数量(param) 网络中的参数量(p ...
最新文章
- ESI世界大学排名:371所内地高校上榜!
- linux stress 命令 模拟系统高负载
- 安装 m2eclipse 插件
- StyleAI:印象坐标-感情色彩量化/感情近邻关系
- 其他平台上测试工具的使用
- 漫画:如何破解MD5算法
- Python 元组(Tuple)操作详解
- select查询语句执行顺序
- centOS7挂在windows移动硬盘方法
- 案例:实现商品分类导航栏
- 2学习率调整_Keras的Adam优化器参数理解及自适应学习率
- 一个三年Java程序员的面试总结!
- php修改另一个文件内容,php如何修改文件内容
- 为什么Linux红帽认证能经久不衰?
- Face photo recognition using sketch (人脸画像合成)
- 一步步教您搞定讯飞语音识别 | 寻找C站宝藏
- 中国正式进入 5G 商用元年!
- 一个人在家怎么赚钱?普通人如何通过网络实现在家就能赚钱
- 商业计划汇报PPT模板
- 提供优质客户服务的5种方法
热门文章
- You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).Please, commit your changes
- 数值计算 - Richardson外推法求一阶导数(C++实现)
- 徐鹤宁语录【销售篇】
- python 网页生成pdf_3个步骤教你如何用Python实现网页转PDF
- 基于 Node.js + Koa 构建完整的 Web API (配置 ESLint 和使用 Airbnb 编码规范)
- 斐波纳契数列 python123
- 面试吹牛B,入职就倒霉了
- 2022-2027年中国共享自行车行业发展监测及投资战略研究报告
- JS中的运算符号(加号)
- mysql中约束由数字构成_MySQL 数据类型和约束(外键是重点)