有关于contiguous()的含义

探讨关于contiguous()的含义以及使用方法

首先如果我们创建一个全新的tensor张量,那么它会自带一个属性contiguous(两者状态True,False),
而我们我们都知道任何一个tensor都有尺寸,但还有一个东西叫布局,可能很多人不理解布局是什么意思,
其实这要回到python底层是由c语言书写的,每一个tensor中的元素都有它的下标索引位置,
比如现在我们创建一个x=torch.rand((5,3,2)),那么它的布局strid=(6,2,1),
stride的含义指的是:
先解释一下此处的遍历是什么意思,即相同的维度下:相邻的元素坐标索引的差值
对于维度0:需要遍历6个元素才能到该维度的下一个索引;
对于维度1:需要遍历2个元素才能到该维度的下一个索引;
对于维度2:需要遍历1个元素才能到该维度的下一个索引;

再比如一个x=torch.rand((5,2,3)),那么它的布局strid=(6,3,1),
stride的含义指的是:
对于维度0:需要遍历6个元素才能到该维度的下一个索引;
对于维度1:需要遍历3个元素才能到该维度的下一个索引;
对于维度2:需要遍历1个元素才能到该维度的下一个索引;
这两个stride的书写规则都依赖于它们两个张量的属性contiguous是True
(即连续的,在内存中的表现可以理解为它不与任何其他的变量公用内存)

而在torch有一些方法(转换维度的方法),它本身只改变尺寸大小,但并不能够更改变量最初的布局属性(即每个元素的下标索引)
例如以下的例子:
x=torch.rand((5,3,2)):contiguous=True,stride=(6,2,1)

x1=x.transpose(-1,-2):
contiguous=False,stride=(6,1,2)
虽然shape=(5,2,3),但由于contiguous=False,那么它的元素坐标还是原本的布局方式,
也就是说此时转换维度是在原有的布局上编排,因此stride=(6,1,2)

x2=x.transpose(-1,-2).contiguous():
contiguous=True,stride=(6,3,1)
此时shape=(5,2,3),但由于contiguous=True,那么它的元素坐标索引将会被重新布局,
也就是现在的布局方式是在转换维度之后重新编排的

x1与x2的区别主要就是在两者的布局方式是在变换维度之前编排还是在变换维度之后编排的。

import torch
x=torch.rand((5,3,2))
print(x.stride(),x.is_contiguous())
x1=x.transpose(-1,-2)
print(x1.stride(),x1.is_contiguous())
x2=x.transpose(-1,-2).contiguous()
print(x2.stride(),x2.is_contiguous())
输出:
(6, 2, 1) True
(6, 1, 2) False
(6, 3, 1) True

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值