【PyTorch】关于张量的连续性(contiguous)

news/2025/1/12 10:56:34/

文章目录

    • 引入:`view`和`reshape`有什么区别
    • 问题1:什么叫满足连续性的张量
    • 问题2:如何判断一个张量是否满足连续性条件
    • 问题3:为什么有些操作需要连续的张量
    • 方法1:不连续的张量转成连续张量
    • 问题4:为什么`reshape`可能会返回一个视图或者一个拷贝

引入:viewreshape有什么区别

view返回的是视图,而reshape一般返回拷贝(取决于原始张量的存储方式)

视图:共享底层数据

view只能用于满足连续性张量的视图

问题1:什么叫满足连续性的张量

连续性条件的含义是,张量底层一维数组元素的存储顺序与张量按行优先一维展开的元素顺序是否一致。

>>> x = torch.arange(12).reshape(3,4)
>>> x
tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])

这个张量是连续的,因为它的底层数据的存储顺序是[0, 1, 2, … , 11],与它按行优先一维展开的顺序相同。

问题2:如何判断一个张量是否满足连续性条件

  1. y.is_contiguous()True说明连续

  2. y.stride(),如果stride与y的形状不匹配,说明不连续

    例如

    >>> x = torch.arange(6).reshape(2,3)
    >>> x
    tensor([[0, 1, 2],[3, 4, 5]])
    >>> x.stride()
    (3, 1)
    >>> y = x.transpose(0,1)  # 转置之后不再满足连续性
    >>> y
    tensor([[0, 3],[1, 4],[2, 5]])
    >>> y.is_contiguous()
    False
    >>> y.stride()
    (1, 3)
    

    y按行展开的stride应该是(2, 1),所以y不连续(不满足问题1)

问题3:为什么有些操作需要连续的张量

因为有些操作在底层实现的时候,需要按照一定的顺序访问或修改张量的元素,而不连续的张量会导致这些操作变得复杂或低效。

回到引入,为什么view只能用于满足连续性张量的视图?

因为它的作用是在不改变底层数据的情况下,使用新的形状查看张量。如果张量不是连续的,那么它的底层数据的存储顺序与它按行优先一维展开的顺序不同,这样就无法用一个新的步长来实现形状的变化

方法1:不连续的张量转成连续张量

接着上一个代码段,调用contiguous()函数即可

>>> z = y.contiguous()  # 将不连续张量y转成连续张量
>>> z
tensor([[0, 3],[1, 4],[2, 5]])
>>> z.is_contiguous()  # z连续
True
>>> z.stride()
(2, 1)

问题4:为什么reshape可能会返回一个视图或者一个拷贝

reshape 会根据原始张量的内存布局来决定是否可以通过修改步长来实现形状的变化,如果可以,返回视图,否则返回拷贝

仍以上面的y为例,下面是返回拷贝的情况

>>> y
tensor([[0, 3],[1, 4],[2, 5]])
>>> y.is_contiguous()  # y不连续
False
>>> z = y.reshape(2, 3)  # 返回拷贝
>>> z
tensor([[0, 3, 1],[4, 2, 5]])
>>> z.is_contiguous()  # z连续
True
>>> y.stride()  # y不连续
(1, 3)
>>> z.stride()  # z连续
(3, 1)

http://www.ppmy.cn/news/452298.html

相关文章

性能测试调优模型、思想和技术

最近阅读《软件性能测试、分析与调优实践之路》一书,个人认为性能调优章节为整部书的精华,该章节包括了性能测试调优模型、调优思想和调优技术。下面是摘抄整理自书中内容: 调优模型 下图为互联网中常见的用户请求的分层转发和处理的过程&a…

Apache Hudi初探(一)(与flink的结合)

背景 和Spark的使用方式不同,flink结合hudi的方式,是以SPI的方式,所以不需要像使用Spark的方式一样,Spark的方式如下: spark.sql.extensionsorg.apache.spark.sql.hudi.HoodieSparkSessionExtension spark.sql.catalog.spark_ca…

【MySQL】模式分解专题

文章目录 规范化模式分解规范化模式分解 规范化模式分解——学生关系(学号,姓名,年龄,性别,系别,系主任) 已知关系模式:学生(学号,姓名,年龄,性别,系别,系主任),一个学生隶属于一个系,一个系只有一个系主任。 请分析关系模式,回答问题: (1)写出函数依赖集…

如何安装PHP框架

目录 什么是PHP框架 第一步 安装PHP依赖包 第二步 导入PHP相关包 第三步 解包并切换进指定目录 第四步 在PHP目录内编译安装 第五步 编译 第六步 拷贝配置文件进行编辑 第七步 修改时区 第八步 修改文件指定路径 第九步 将命令加入指定目录进行识别 第十步 进入配置…

团队介绍 | 魅动 Magic Motion

团队介绍 | 魅动 Magic Motion 团队介绍 | 魅动 Magic Motion 魅动 Magic Motion 是专注于研发、设计和生产智能化私密生活用品的创新品牌。魅动 Magic Motion 将无线移动通信技术与私密生活产品相结合,开发与智能手机实现无缝连接,通过智能手机的免费Ap…

no rule to process file 'xxx/.../jquery.js' of type sourcecode.javascript for architecture i386

解决的办法:将Targets ->Build Phases-> Compile Sources 中的js文件拖拽到Copy Bundle Resource即可 详细解释可以来豫中有宋的博客看看

Win7蓝牙可以配对成功,但是设备列表里面的图像都是灰色的

Win7蓝牙可以配对成功,但是设备列表里面的图像都是灰色的 对于合格的码农来说,对PC的调教只有起点,永无终点。对于影响效率提升的PC环境,我的原则是把电脑按在地上摩擦,直到这匹烈马听话、老实。 Win7试图蓝牙连接Appl…

C语言1.5e10什么意思,汽车排量1.5e是什么意思

汽车排量1.5e是什么意思 你好,1.5是发动机排量。e是基础版的意思汽车1.5T和1.5E各是什么意思 T是涡轮增压发动机,G或E是自然进气的发动机汽车排量为1.5e那么字母e是什么意思 说明汽车是排量为1.5的5档手动变速车【汽车有问题,问汽车大师。4S店…