PyTorch张量:内存布局

你可能对 torch 上的某些函数感到困惑,它们执行相同的操作但名称不同。 例如: reshape()view()permute()transpose() 等。

这些函数的做法真的不同吗? 不! 但为了理解它,我们首先需要了解一下张量在 pytorch 中是如何实现的。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎

张量(tensor)是抽象或逻辑结构,就像数组一样,无法按照其设想的方式实现。 显而易见的原因是内存单元是连续(contiguous)的,因此我们需要找到一种方法将它们保存在内存中。 例如,如果我们有一个如下所示的二维张量(或数组):

将其保存到内存中的正常(或连续)方式是逐行排列。 所以我们将有:

每个张量都有元数据来声明如何读取张量。 例如,在这个 2d 张量中,为了访问下一行,我们必须向前移动 3 步,而下一列我们应该向前移动 1 步。 我们称这两个数字为步幅(stride)。 所以我们可以像下面这样提取它们:

这为我们开辟了新的可能性,因为们可以通过改变步幅元数据来改变张量! 例如,如果我们将步长从(3, 1) 更改为(1, 3),我们实际上转置了矩阵,而无需对所有内存项进行任何操作:

正如你所注意到的,张量不再连续,因为我们更改了它!为了转到下一行,我们只需跳过 1 个值,而跳过3 个值则移动到下一列。
如果我们回想一下张量的内存布局,这是有道理的:

[0, 1, 2, 3, 4, …, 11]

为了移动到下一列(例如从0到3,我们必须跳过 3 个值。因此张量不再是连续的!要使其连续,只需对其调用contigously()即可:

当你调用contigious()时,它实际上会创建张量的副本,因此元素的顺序将与从头开始创建相同形状的张量相同。

请注意,“连续”这个词有点误导,因为它并不是张量的内容分布在断开连接的内存块周围。 这里字节仍然分配在一块内存中,但元素的顺序不同!

同样,视图函数 view()只是原始变量的视图,这意味着如果更改原始内存,它也会发生变化:

这实际上非常有效,因为我们不必为转换创建新的内存槽。 但 reshape()可以复制原始数据。 来自原始文档:

连续输入和具有兼容步幅的输入可以在不复制的情况下进行重塑,但你不应依赖于复制与查看行为。

例如,如果我们有如下代码:

运行输出结果如下:

该视图不适用于非连续数据。

另外,考虑到 permute() 是另一个仅适用于元数据的函数,因此它也会创建不连续的数据。 permute() 改变轴的顺序,因此它与改变矩阵形状的 view() 或 reshape() 完全不同。


原文链接:Pytorch张量内存布局 - BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala集合_数组_元组_映射_列表

数组元组映射列表 1.11 集合(scala.collection) 集合是一种用来存储各种对象和数据的容器。Scala 集合分为可变的和不可变的集合。 1. 不可变集合可以安全的并发访问。 2. 可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加…

二叉树--基础OJ

1.对称二叉树 题目链接:101. 对称二叉树 - 力扣(LeetCode) 题解: 我们可以用递归的方法去做: 如果两个树互为镜像(1.根节点的值相同,2.左子树的值与右子树的值对称)则为对称二叉树&a…

专栏十五:omicverse在单细胞分析中的实际使用体验和小改动

写一些自己的理解吧,一些小步骤,正在更新中。。。 安装 原作者写的很清楚了 大部分直接抄 个别地方:去选择下载适合自己的pytorch版本PyTorch, 比如我的是cuda12,下载命令实际是 pip3 install torch torchvision torchaudio 查看cuda版本命令 nvidia-smi 当然还有个命…

04-Nacos中负载均衡规则的配置

负载均衡规则 同集群优先 默认的ZoneAvoidanceRule实现并不能根据同集群优先的规则来实现负载均衡,Nacos中提供了一个实现叫NacosRule可以优先从同集群中挑选服务实例 当服务消费者在本地集群找不到服务提供者时也会去其他集群中寻找,但此时会在服务消费者的控制台报警告 第…

BMP转PNG工具BMP2PNG

自己写的一个BMP转PNG工具BMP2PNG 写这个工具是因为要使用传奇的部分素材在COCOS2DX使用, 但是COCOS2DX不支持BMP 如果直接将BMP转换到PNG的话,网上找到的工具都不支持透明色转换。难道要用PS一个一个抠图吗?要累死 所以写了这个工具。一些古…

《昆虫记》带我进入了一个昆虫的新世界。

《昆虫记》带我进入了一个昆虫的新世界。 《昆虫记》的作者是法国作家亨利.法布尔,他是法国著名的文学家,昆虫学家,科普作家。被世人称为“科学界的诗人”,“昆虫世界的荷马”,“昆虫世界的维吉尔”,他从小…

I2C 应用编程

1. I2C 框架结构 1.1 I2C 硬件框架 I2C 总线拓扑图 ⚫ 在一个芯片 (SoC) 内部,有一个或多个 I2C 控制器 ⚫ 在一个 I2C 控制器上,可以连接一个或多个 I2C 设备 ⚫ I2C 总线只需要 2 条线:时钟线 SCL 、数据线 SDA ⚫ 在 …

SpringCloud面试题——Sentinel

一:什么是Sentinel? Sentinel是一个面向分布式架构的轻量级服务保护框架,实现服务降级、服务熔断、服务限流等功能 二:什么是服务降级? 比如当某个服务繁忙,不能让客户端的请求一直等待,应该立刻返回给客户端一个备…

C# 图解教程 第5版 —— 第18章 泛型

文章目录 18.1 什么是泛型18.2 C# 中的泛型18.3 泛型类18.3.1 声明泛型类18.3.2 创建构造类型18.3.3 创建变量和实例18.3.4 使用泛型的示例18.3.5 比较泛型和非泛型栈 18.4 类型参数的约束18.4.1 Where 子句18.4.2 约束类型和次序 18.5 泛型方法18.5.1 声明泛型方法18.5.2 调用…

Flutter实现自定义二级列表

在Flutter开发中,其实系统已经给我们提供了一个可靠的二级列表展开的API(ExpansionPanelList),我们先看系统的二级列表展开效果,一次只能展开一个,用ExpansionPanelList.radio实现 由此可见,已经…

算法Day29 打印数目

打印数目 Description 小硕有一套字母表arr,其中每个上都刻有一个字母arr[i]。返回小硕可以印出的非空字母序列的数目。 注意:本题中,每个字母只能使用一次。 Input 输入字符串arr 1≤arr.length≤7 Output 输出可打印数目 Sample 代码 imp…

血的教训,BigDecimal踩过的坑

很多人都用过Java的BigDecimal类型,但是很多人都用错了。如果使用不当,可能会造成非常致命的线上问题,因为这涉及到金额等数据的计算精度。 首先说一下,一般对于不需要特别高精度的计算,我们使用double或float类型就可…