使用thop计算参数和FLOPs时的疑问

news2024/9/23 7:29:30

文章目录

    • 使用thop计算参数时的疑问
      • x = x.view(-1, 32 * 8 * 8)和x = x.view(x.size(0), -1)区别是什么
      • input_shape = (3, 224, 224)这个张量是什么意思
      • 为什么summary计算时没有批次大小
      • input_tensor = torch.randn(1, *input_shape).to(device)这句代码什么意思
      • flops, params = profile(net, inputs=(input_tensor,))这句话什么意思
      • 为什么用inputs=(input_tensor,),而不是inputs=(input_tensor)呢
      • flops, params = clever_format([flops, params], "%.3f")这个代码什么意思

在这里插入图片描述

使用thop计算参数时的疑问

x = x.view(-1, 32 * 8 * 8)和x = x.view(x.size(0), -1)区别是什么

x.view(-1, 32 * 8 * 8)x.view(x.size(0), -1) 都是将一个多维张量 x 转换为一个二维张量,但是它们的实现方式略有不同。

x.view(-1, 32 * 8 * 8)-1 参数表示该维度的大小由其他维度的大小和张量的总元素个数自动推导而来。在这个例子中,32 * 8 * 8 是张量 x 在第二个维度上的元素个数,而 -1 表示第一个维度的大小应该自动计算以保证张量的总元素个数不变,因此,x.view(-1, 32 * 8 * 8) 的作用是将张量 x 展开为一个二维张量,其中每一行表示一个样本的所有特征向量。

x.view(x.size(0), -1) 的实现方式略有不同,其中 x.size(0) 表示张量 x 在第 0 维的大小,也就是张量的批次大小(batch size)。因此,x.view(x.size(0), -1) 的作用是将张量 x 的第一个维度(批次大小)保持不变,将其余的所有维度展开为一个二维张量,其中每一行表示一个样本的所有特征向量。

总的来说,这两种方法都可以将卷积层的输出展开为一个二维张量以便于传递给全连接层进行分类或回归任务。两种方法的区别在于 -1 参数的使用方式,其中 x.view(-1, 32 * 8 * 8) 更加简洁,但是需要确保张量的总元素个数不变,而 x.view(x.size(0), -1) 则需要显式地指定批次大小以及展开后的维度大小,但是更加灵活。

input_shape = (3, 224, 224)这个张量是什么意思

input_shape = (3, 224, 224) 是一个元组(tuple),其中包含了一个三维张量的形状(shape)。在这个例子中,这个三维张量的形状是 (3, 224, 224),它表示一个 RGB 图像,其中包含 3 个颜色通道(红、绿、蓝),每个通道的高度和宽度都是 224 像素。

在深度学习中,通常需要指定输入数据的形状,以便于为模型构建输入层。在这个例子中,input_shape 就是这样一个形状。在定义模型时,可以使用这个形状来定义输入层的大小和形状,以确保模型能够处理输入数据。

需要注意的是,这个元组仅仅是描述了一个形状,它并不是一个实际的张量。要创建一个具有这个形状的张量,可以使用 PyTorch 中的 torch.zeros()torch.ones() 等函数创建一个全零或全一张量,并指定这个张量的形状为 input_shape

为什么summary计算时没有批次大小

summary() 函数在计算模型参数数量和 MACs(multiply-accumulate operations)时,并不需要知道批次大小。因此,在调用 summary() 函数时,可以将 input_shape 设置为不包含批次大小的形状。

在这个例子中,input_shape = (3, 224, 224) 表示一个 RGB 图像,其中包含 3 个颜色通道,每个通道的高度和宽度都是 224 像素。在模型的输入层中,通常会将批次大小作为额外的维度添加到输入数据中,因此,对于单张图片来说,其形状应该是 (1, 3, 224, 224)

但是,summary() 函数并不需要知道批次大小,因为它只关心模型的结构和参数数量以及 MACs。因此,在调用 summary() 函数时,可以将 input_shape 设置为不包含批次大小的形状,例如 (3, 224, 224),而不会影响 summary() 函数的计算结果。

input_tensor = torch.randn(1, *input_shape).to(device)这句代码什么意思

这句代码的作用是创建一个形状为 (1, 3, 224, 224) 的张量 input_tensor,并将其移动到指定的设备上。

具体来说,这句代码分为两个部分。首先,torch.randn(1, *input_shape) 创建了一个形状为 (1, 3, 224, 224) 的张量 input_tensor,其中 1 表示批次大小,3 表示颜色通道数,224 表示图像的高度,224 表示图像的宽度。torch.randn() 函数会返回一个张量,其中的元素是从均值为 0,方差为 1 的正态分布中随机采样的。

然后,.to(device) 将张量 input_tensor 移动到指定的设备上,其中 device 是一个 PyTorch 设备对象,表示要将张量移动到哪个设备上。例如,如果 device = 'cpu',则将张量移动到 CPU 上;如果 device = 'cuda',则将张量移动到 GPU 上。

总的来说,这句代码的作用是创建一个形状为 (1, 3, 224, 224) 的张量 input_tensor,并将其移动到指定的设备上,以便于将其传递给模型进行计算。这个张量可以表示一个 RGB 图像,其中包含 1 张图片,每张图片包含 3 个颜色通道,每个通道的高度和宽度都是 224 像素。在模型的计算过程中,可以将这个张量传递给模型作为输入数据。

flops, params = profile(net, inputs=(input_tensor,))这句话什么意思

这句代码的作用是使用 PyTorch 的 torch.profiler.profile() 函数,对给定的模型 net 在输入数据 input_tensor 上进行性能分析,并输出模型的计算量和参数数量。

具体来说,profile() 函数接受一个 PyTorch 模型和输入数据,自动计算模型在输入数据上的计算量和参数数量,并返回这两个值。其中,计算量通常使用 FLOPs(floating-point operations)作为衡量标准,表示模型在执行前向传播时需要进行的浮点运算次数;而参数数量则表示模型中需要学习的参数的数量,包括权重和偏置等。

在这个例子中,net 是一个 PyTorch 模型,input_tensor 是一个形状为 (1, 3, 224, 224) 的输入张量,表示一张 RGB 图像。inputs=(input_tensor,) 是一个元组,其中包含了输入数据,用于传递给 profile() 函数。

执行这句代码后,flopsparams 分别表示模型在输入数据上的 FLOPs 和参数数量。这个结果可以用于评估模型的计算复杂度和内存使用情况,以便于优化模型的性能。

为什么用inputs=(input_tensor,),而不是inputs=(input_tensor)呢

在这个例子中,使用 inputs=(input_tensor,) 的方式传递输入数据是为了满足 profile() 函数的输入要求。

profile() 函数的输入参数 inputs 是一个元组(tuple),其中包含了输入数据。即使只有一个输入张量,也必须将其放在一个元组中传递给 inputs 参数。这是因为 inputs 参数需要接受一个可迭代对象(iterable),而元组是一种可迭代对象,可以用于传递单个或多个输入数据。

在这个例子中,input_tensor 是一个形状为 (1, 3, 224, 224) 的 PyTorch 张量,表示一张 RGB 图像。要将这个张量作为输入数据传递给 profile() 函数,必须将其放在一个元组中,即 (input_tensor,)。如果直接使用 inputs=(input_tensor),则会将整个张量作为输入参数传递给 profile() 函数,而不是放在一个元组中,这会导致参数类型不匹配的错误。

flops, params = clever_format([flops, params], “%.3f”)这个代码什么意思

这句代码的作用是使用 clever_format() 函数,将给定的 FLOPs 和参数数量进行格式化,以便于显示在屏幕上。

具体来说,clever_format() 函数接受一个数字或一个元组,表示要进行格式化的数据。在这个例子中,输入的是一个包含两个数字的元组 [flops, params],其中 flops 表示模型的计算量(FLOPs),params 表示模型的参数数量。第二个参数 %.3f 指定了浮点数的格式,其中 % 表示格式化字符串的起始标志,.3 表示保留 3 位小数,f 表示格式化为浮点数。

执行这句代码后,flopsparams 分别表示格式化后的模型计算量和参数数量,可以直接显示在屏幕上。例如,如果 flops=1234567890params=123456,则执行 clever_format([flops, params], "%.3f") 后的结果可能是 1.235G FLOPs, 123.456K params,表示模型的计算量约为 1.235 亿次浮点运算,参数数量约为 123,456 个。这个结果可以更加直观地表示模型的复杂度和规模,便于进行模型选择和优化。

这里是这个模型的FLOPs计算步骤:

  1. 第一个卷积层: 64输出通道,输入大小为224224,卷积核大小33
    FLOPs = 64 * 33 * 224224 = 1.579G

  2. 第二个卷积层: 同样64输出通道,输入大小不变
    FLOPs = 64 * 33 * 224224 = 1.579G

  3. 池化层后,大小变为112*112

  4. 第三个卷积层: 128输出通道,输入大小112112,卷积核33
    FLOPs = 128 * 33 * 112112 = 0.633G

  5. 第四个卷积层:同样128输出通道,输入大小不变
    FLOPs = 128 * 33 * 112112 = 0.633G

  6. 全连接层前,flatten为12888
    FLOPs = 12888 * 1024 = 8.388M

  7. 第一个全连接层: 1024个神经元
    FLOPs = 88128 * 1024 = 8.388M

  8. 第二个全连接层:10个神经元
    FLOPs = 1024 * 10 = 10.24K

总的FLOPs为:
1.579G + 1.579G + 0.633G + 0.633G + 8.388M + 8.388M + 10.24K = 6.357G

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1AE4混合电路耳放

设计目标: 1)20W以内的总功耗(包括灯丝部分); 2)最大输入1.2Vrms信号; 3)输出至少50毫瓦的功率; 4)至少5倍以上的阻尼系数。 1AE4是较后期的直热管&#xff0…

软件项目成本控制的5大关键点 不得不重视

软件项目成本一般分为运营成本和项目成本。而运营成本比较固定,压缩和削减的余地不大。而在项目成本中,最主要的成本是人工成本。那么如何提高项目开发效率,节约人工成本,对成本管理至关重要。 我们从以下几个影响项目成本的主要因…

[DeepSpeed]初代chatGPT模型部署实践

DeepSpeed Chat 部署方式 中间遇到很多坑,解决方法都写这里了DeepSpeed 部署中bug以及解决方法 环境 基于阿里云GPU 云服务器部署实践 操作系统版本: Ubuntu 18.04 GPU 驱动版本: 470.161.03 GPU 型号: A100-80G CPU &#…

投了上千简历,是Android岗位需求少?还是我的技术不行

作者:病鸡乱投医 作为一名Android开发人员,打开招聘网站是每天必做的事情。每次看到悬赏诱人的Android工程师职位,就想做个简历有技巧、能够吸引面试官的面面观。 然而,即使投了上千份简历,也迟迟没有找到理想的工作。…

makefile编译脚本,理解$@、$^和$<

一、理解 、 、 、^、$<的含义 Makefile中&#xff0c;格式为这样的 target : prerequisties 目标&#xff1a;需要依赖的条件 简单的工程直接这样 hello:hello.ccgcc hello.cc -o hello但如果文件多了呢&#xff1f;按部就班写会显得很长&#xff0c;所有这时候makefil…

惊现数据库误操作后,看这家银行如何打造“零盲区”运维安全

第三方运维人员数据库误操作致业务中断 堡垒机凸显短板 这家银行如何破局&#xff1f; 走在数字化转型前沿的银行业&#xff0c;不断增加的IT资产、业务系统&#xff0c;给IT运维提出了更高的挑战。银行运维的核心之一在于数据安全、系统稳定&#xff0c;面临着庞杂的运维场景…

【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析

【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析 文章目录 【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析1. 准备工作2. 计算这些指标 &#xff08;5&#xff09;2.1 Accuracy&#xff08;准确率&#xff09;2.2 Recall&#xff08;召回率、查全率&#xff09;2.3 Pr…

【跟着陈七一起学C语言】今天总结:C语言的数组和指针

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

HR怎么看待PMP证书呢?

我们可以先了解一下各个公司对于PMP证书的一个观点 针对PMP证书&#xff0c;在HR看来&#xff0c;有这几个直观的感受和判断&#xff1a; 公司要求PMP优先&#xff0c;那我盯着这个看就行&#xff0c;没有就不要&#xff0c;省事儿招的多了也有一些基本了解&#xff0c;考到这…

【Linux】Linux环境下安装RocketMQ(图文解说详细版)

文章目录 一、简介二、MQ 下载三、JAVA 环境配置四、MQ 安装五、启动 MQ六、测试七、运行八、关闭 MQ 一、简介 消息队列中间件是分布式系统中的重要组件&#xff0c;主要解决应用耦合、流量削峰等问题&#xff0c;目前主流的 MQ 主要是&#xff1a;RocketMQ、kafka、RabbitMQ…

GRPC - JAVA笔记

GRPC - JAVA笔记 gRPC简介 由google开源的一个高性能的RPc框架&#xff0c;由google内部的Stubby框架演化而来。2015年正式开源。云原生时代的RPC标准&#xff0c;由Go语言开发 gRPC的核心设计思路 网络通信 ------> gRPC 自己封装了网络通信的部分&#xff0c;提供了多种…

zookeeper超详细安装集群部署

文章目录 一、zookeeper官网下载二、JDK环境安装三、zookeeper安装1.zookeeper解压2.zookeeper配置文件介绍 克隆服务器1.网络检查2.集群配置3.启动集群4.错误记录 一、zookeeper官网下载 下载地址&#xff1a;https://archive.apache.org/dist/zookeeper/找到对应的版本下载 …

文章纠错免费软件-文字校对软件免费下载

自动校对稿件的软件 自动校对稿件的软件是一种基于自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;和机器学习&#xff08;Machine Learning&#xff09;技术的工具&#xff0c;可以较为准确地检测和纠正文本中出现的语法、拼写、标点符号以及其他笔误…

如何优雅的白嫖ChatGPT

ChatGPT已经火了大半年了&#xff0c;但对于很多小伙伴来说想使用它还是有些麻烦&#xff0c;不仅需要稳定的漂亮国ip,还要冒着被封号的风险。 因此&#xff0c;本文介绍了两个白嫖ChatGPT的方式供大家使用&#xff08;亲测可用&#xff09;&#xff1a; Poe 地址(科学上网)…

入行IC|数字IC与模拟IC方向怎么选?(内附2023春招薪资对比)

很多同学想要入行IC&#xff0c;但不知道数字和模拟方向怎么选&#xff1f; 如果没有亲身体会过模拟设计&#xff0c;并有发自内心的自信或者兴趣&#xff0c;一般不看好纯小白去学模拟电路设计。 模拟设计想做好&#xff0c;没有数学功底&#xff0c;没有电路分析的功底&…

C++Primer第20章 iostream库

第20章 iostream库 C中的IO流是通过多继承和虚拟继承实现的,下面是它的关系. 我们要学习的就是三个库,这里我会把重点的拿出来 iostream: 终端操作fstream:文件操作sstream:格式化操作 20.1 输出操作符<< 输出操作符可以接受任何内置数据类型的实参,包含我们的const …

HTTP第六讲——键入网址再按下回车,后面究竟发生了什么?

使用 IP 地址访问 Web 服务器 首先我们运行 www 目录下的“start”批处理程序&#xff0c;启动本机的 OpenResty 服务器&#xff0c;启动后可以用“list”批处理确认服务是否正常运行。 然后我们打开 Wireshark&#xff0c;选择“HTTP TCP port(80)”过滤器&#xff0c;再鼠标…

接口自动化测试神器:Python+Requests+Unittest让你的测试用例飞起来

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠 随着互联网的发展&#xff0c;越来越多的应用程序采用了分布式架构&#xff0c;并通过API接口进行数据交换。因此&#xff0c;接口自动化测试已经成为了保证软件质…

git简介和使用、基础命令

文章目录 一、git的安装与配置二、Git工作区原理三、Git的使用和仓库的创建四、Git的常用操作五、配置公钥六、IDEA中配置Git 一、git的安装与配置 https://tortoisegit.org/ 下载对应版本安装即可 注意&#xff1a;配置中输入邮箱和密码一定要和自己的git账户一致 git的配置…

Seqkit-2.2.0 移植指南(openEuler 20.03 LTS SP3)

1.软件介绍 seqkit是一种跨平台的、极快的&#xff0c;全面的fasta/q处理工具。seqkit为所有的主流操作系统提供了一种可执行的双元文件&#xff0c;包括Windows&#xff0c;Linux&#xff0c;MacOS X&#xff0c;并且不依赖于任何的配置或预先配置就可以直接使用。 关于seqk…