Pytorch基础 - 0. Tensor数据类型与存储结构

news2025/3/3 18:20:17

目录

1. Tensor数据类型

2. Tensor存储结构


在讲PyTorch这个系列之前,先讲一下pytorch中最常见的tensor张量,包括数据类型,创建类型,类型转换,以及存储方式和数据结构。

1. Tensor数据类型

(1) 一共包括9种数据类型,3大类

torch.LongTensor常用在深度学习中的标签值 ,比如分类任务中的类别标签0,1,2等torch.FloatTensor常用做深度学习中可学习参数或者输入数据的类型

(2) pytorch中的 type() 和 dtype

tensor.type():返回的是数据所属的Tensor类型,如 torch.LongTensor等
tensor.dtype:返回的是tensor数据自身的类型,如 torch.int8, torch.long等

x = torch.tensor([1, 2])
print(x.dtype)  # torch.int64
print(x.type()) # torch.LongTensor

(3) pytorch默认的整数是int64, 默认的浮点数是float32。

x = torch.tensor([1, 2, 3])
print(x.dtype)  # torch.int64
y = torch.tensor([1., 2., 3.])
print(y.dtype)  # torch.float32

(3) 使用两种方式创建不同类型的张量

【方式1】直接在后面用dtype定义tensor类型

【方式2】参考上面数据类型表格中的最右侧Tensor type来新建不同类型的张量

# 方式1:直接在后面用dtype定义tensor类型
x = torch.tensor([1, 2, 3], dtype=torch.int8)
print(x.dtype)  # torch.int8

# 方式2: 参考上面数据类型表格中的最右侧Tensor type来新建不同类型的张量
y = torch.CharTensor([1, 2, 3])
print(y.dtype)  # torch.int8

注意:torch.tensor() 和 torch.Tensor()新建张量的区别

torch.Tensor()本质是torch.FloatTensor(),新建的tensor是float类型的

toch.tensor(data, dtype=None, device=None, requires_grad=False) 可以根据dtype定义不同类型

x = torch.Tensor([1, 2])
print(x.type()) # torch.FloatTensor
y = torch.tensor([1, 2], dtype=torch.long)
print(y.type())  # torch.LongTensor

(4) 使用两种方式进行不同类型的转换

【方式1】使用 float(), short(), int(), long()等函数

【方式2】使用x.type的方式

# 方式1:使用 float(), short(), int(), long()等函数
x = torch.tensor([1, 2, 3])
x = x.short()
print(x.dtype)  # torch.int16

# 方式2: 使用x.type的方式
y = torch.tensor([1, 2, 3])
y = y.type(torch.int64)
print(y.dtype)  # torch.int64

2. Tensor存储结构

(1) Tensor的数据结构如下图所示,主要包含下面两个部分。

  • 头信息区 Tensor:保存张量的形状size,步长stride,数据类型int, char等信息
  • 存储区 Storage:保存真正的数据,Storage是在data之上的接口
  • 头信息区的占用内存较小,Storage为主要的占用内存

 (2) 注意:不同的tensor的头信息可能不同,但是却可能共享相同的storage,如下示例

通过reshape或者view的操作,只改变了头部信息,如storage,storage内容和内存地址没有改变

x = torch.tensor([1, 2, 3, 4, 5, 6])
y = x.reshape(2, 3)
print(x.storage(), y.storage()) # 1 2 3 4 5 6    1 2 3 4 5 6
print(x.storage().data_ptr(), y.storage().data_ptr()) # 2330435641664 2330435641664
print(x.stride(), y.stride())   # (1,) (3, 1)

所以此时当x改变,y也跟着改变,因为x和y共享相同的storage

x = torch.tensor([1, 2, 3, 4, 5, 6])
y = x.reshape(2, 3)
x[0] = 11
print(y)    # tensor([[11, 2, 3], [4, 5, 6]])

(3) 知识补充: id() 和 data_ptr()的区别和误区

在tensor中,常用x.storage().data_ptr() 来判断两个tensor是否共享storage(),这是torch提供的一个来自于C++底层的方法,该方法可以返回storage()里的首元素的内存地址。如下:

x = torch.tensor([1, 2, 3, 4, 5, 6])
y = x.reshape(2, 3)
print(x.storage().data_ptr(), y.storage().data_ptr())  # 1672574819456 1672574819456

id() 默认不会返回对象的内存地址,而是返回一个唯一的对象标识符,并且在该对象的生命周期内是不变的。虽然,CPython实现以某种方式使用内存地址。但这不应该作为一般情况下的参考。因此用id()来对storage()进行判断时,会出现下面情况 - id不相等

x = torch.tensor([1, 2, 3, 4, 5, 6])
y = x.reshape(2, 3)
print(id(x.storage()))  # 2271657541704
print(id(y.storage()))  # 2271657679944

但是受到上面的启发,感觉他们的内存是共享的,那肯定是相等的啊。为什么不相等呢?很简单,是因为x.storage()和y.storage()新建了两个不同的对象,也就是指针,只不过这俩指针指向的是相同的一块内存,但是这俩对象的id是不等的。

那除此之外,有时候他们的id也会相等的时候,如下:

x = torch.tensor([1, 2, 3, 4, 5, 6])
y = x.reshape(2, 3)
print(id(x.storage()), id(y.storage()))  # 2137680796872 2137680796872

为什么相等呢?是因为内存的释放速度问题,第一个x新建完释放了内存,然后该内存直接给y.storage()了,所以会相等。

综上:判断两个tensor是否共享storage(),使用storage().data_ptr()才行!不可使用id

注:该博客中部分图文参考链接:【小白学PyTorch】9 tensor数据结构与存储结构 - 知乎,PyTorch 笔记(11)— Tensor内部存储结构(头信息区 Tensor,存储区 Storage)

        

如看其他Docker内容,可看本博客 Pytorch操作,持续更新中。 

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

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

相关文章

深度学习基础入门篇[六]:模型调优,学习率设置(Warm Up、loss自适应衰减等),batch size调优技巧,基于方差放缩初始化方法。

【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化…

HIve安装配置(超详细)

文章目录 Hive安装配置一、Hive安装地址二、Hive安装部署1. 把 apache-hive-3.1.2-bin.tar.gz上传到Linux的/export/software目录下2. 解压apache-hive-3.1.2-bin.tar.gz到/export/servers/目录下面3. 修改apache-hive-3.1.2-bin.tar.gz的名称为hive4. 修改/etc/profile&#x…

如何用四元数表示姿态差

在机器人控制中,经常需要控制末端工具的姿态,如果用欧拉角表示姿态,会出现万向锁的问题,而使用四元数就不会有这个问题,此外四元数求出的姿态差为一个标量,更容易在RL算法中使用。 首先,假设末端…

初始化一个Vue3+TS项目

目录 一.创建基本的项目结构: 二. 项目搭建规范: 集成editorconfig配置: 使用prettier工具: 使用ESLint检测 : 项目目录结构划分: CSS样式的重置: 全家桶 – 路由配置: 全家桶 – 状态管理: 网络请求封装axios: 区分 development和production 环境: Element-Plus集成…

第1章、C++基础

第1章、C基础 1.1 命名空间 1.1.1 命名空间的含义 在使用C进行大规模程序设计时,开发过程往往是团队合作,各个程序员命名和各种C库,对标识符的命名可能发生冲突,从而引进命名空间(一种特殊的域)的概念&a…

MIPI D-PHYv2.5笔记(19) -- Fault Detection

声明:作者是做嵌入式软件开发的,并非专业的硬件设计人员,笔记内容根据自己的经验和对协议的理解输出,肯定存在有些理解和翻译不到位的地方,有疑问请参考原始规范看 检测链路的故障有三种不同的机制。总线冲突&#xff…

10.1 二重积分的概念与性质

学习目标: 学习二重积分,我会采取以下几个步骤: 了解基本概念:首先我会学习二重积分的定义及其意义,了解二重积分的性质和特点,以及二重积分的计算方法。 理解二重积分的几何意义:我会通过画图…

Window10 源码编译UE4-27

Window10 源码编译UE4-27 文章目录 Window10 源码编译UE4-27一、查看官方软件软件环境配置([https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/DevelopmentSetup/VisualStudioSetup/](https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/…

编写高质量代码:改善Java程序的151个建议(数组和集合)

集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法有关系吗?有关系,在compareTo的返回为0时,它表示的是 进行比较的两个元素时相等…

SRv6项目实践(三):P4Runtime基础以及交换机控制

在正式介绍P4runtime基础之前,先说一说P4的编译和实现的过程 bmv2.json:p4文件经过编译器编译以后会生成bmv2.json文件,此文件以JSON格式定义BMv2 simple_switch目标的配置。当simple_switch接收到新的数据包时,它使用此配置以与…

24.Spring练习(spring、springMVC)

目录 一、Spring练习环境搭建。 (1)设置服务器启动的展示页面。 (2)创建工程步骤。 (3)applicationContext.xml配置文件。 (4)spring-mvc.xml配置文件。 (5&…

新建论文三线表模板,一键格式刷

论文三线表模板 写在最前面①表设计,新建表格样式②三线表上下线③三线表标题线④设置表格居中⑤设置表头格式容易出错的步骤 写在最前面 论文写完啦,准备调整格式 之前建模也是三线表,但只能基于该文档模板,所以重新设置一下。 …

linux speedtest-cli工具测试网络带宽、测试网速(下载速度、上传速度和延迟等信息)

speedtest-cli是一个命令行工具,用于测试网络的带宽。它可以在Linux、macOS和Windows等操作系统上运行。下面是使用speedtest-cli测试网络带宽的步骤: 安装speedtest-cli。在Linux系统上,可以使用以下命令安装: sudo apt-get in…

cookies 和 Session

并且注意 meta complete改为“false”,不然不支持Servlet注解 Session会话 会话:用户打开一个浏览器,点击了很多超链接,访问了 有状态会话:一个同学曾今来过教室,下次再来教室,我们会知道这个同学&#…

verdaccio搭建npm私服

1 安装依赖 npm install verdaccio -g开机自启 npm install pm2 -g2启动服务 pm2 start verdaccio 进入页面 http://localhost:4873/ 其他 修改 config.yaml 源为淘宝源 uplinks:npmjs:url: https://registry.npm.taobao.org/

【花雕学AI】真是太多了:汇总国内免费在线使用ChatGPT的完整镜像站列表大全(1000+)

一、ChatGPT为什么火爆? 它是一个可以和你聊天的人工智能程序,它可以用文字回答你的问题,也可以根据你的提示写出文章、歌词、代码等内容。ChatGPT是由一个叫OpenAI的机构开发的,它使用了一种叫做GPT的技术,这种技术可…

[Android+JetPack] (Java实现) Retrofit2+RxJava3+Paging3+RecyclerView 实现加载网络数据例子 记录

文章目录 前言参考链接依赖库及版本Demo效果接口及数据展示各项模块Retrofit2Bean,对应上面的接口返回.Service API部分 Paging3PagingSource以及 RxPagingSourcePagingDataAdapter 适配器ViewModelPublicInfoPage /Activity 最后 前言 继续安卓学习之旅,本章的主要目标是: 1.完…

2023年mathorcup杯A题代码小技巧总结

写篇杂文,不属于我的任何一个栏目,没啥案例含义,主要是记录一下mathorcup杯期间写的代码技巧。 mathorcup杯大部分都是组合优化问题,这让我擅长的机器学习都深度学习毫无作用....... 还好这个A题是可以遍历求所有解的&#xff0c…

SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇

文章目录 通过CSV文件创建物料主数据的一些建议在DIF中使用CSV文件文件转换器类型BAdIBAdI 示例代码测试 DIF全篇总结 通过CSV文件创建物料主数据的一些建议 在Staging Area中创建/修改小批量的物料主数据,推荐使用标准文件上载功能(USMD_FILE_UPLOAD&am…

计算机基础--Redis

参考文献 https://zhuanlan.zhihu.com/p/599663544 基础知识 1. Redis的数据类型及使用场景 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表)&#xff…