目录
1、引言
Tensor的连续性是指其底层一维数组元素的存储顺序与按行优先一维展开的元素顺序是否一致。
2、底层数据的存储
Tensor的底层数据在内存上是连续存储的,通过代码说明如下:
用到的python函数与方法
x.data_ptr() #该函数返回Tensor数据的实际内存的起始地址
id(x) #该函数返回x在python内存管理系统中的唯一标识符
初始化2×3的tensor,使用data_ptr()方法把每一个元素的实际内存输出到列表中,由于元素是int64,int64占用8个字节(64位),连续存储地址间隔为8。
x=torch.tensor([[1,2,3],[4,5,6]]) print(x)
tensor([[1, 2, 3], [4, 5, 6]])print([i.data_ptr() for i in x.flatten()])
[1497599557248, 1497599557256, 1497599557264, 1497599557272, 1497599557280, 1497599557288]这些地址间隔为8,说明元素连续存储。
3、按行优先一维展开
标签:连续性,tensor,PyTorch,按行,一维,print,底层,Tensor From: https://blog.csdn.net/liumaoshen/article/details/142345194通过x转置得到新Tensor变量y
y=x.T print(y)
tensor([[1, 4], [2, 5], [3, 6]])通过.storage()查看底层数据,通过.flatten()按行优先一维展开,通过.is_contiguous()判断是否连续
下面测试中:
1、x按行优先一维展开的数据视图与底层数据顺序一致,x是连续的
2、y按行优先一维展开的数据视图与底层数据顺序不一致,y不是连续的
3、x与y共用同一底层数据,起始地址都是1497599557248
4、x与y两个id()不同
总结:
1和2证实连续性判定的;
3和4说明x与y是不同的Tensor,但是共用相同的底层数据,进一步体现了Tensor的内部结构。
print(x.flatten()) print(x.storage()) print(id(x)) print(x.data_ptr()) print(x.is_contiguous())
tensor([1, 2, 3, 4, 5, 6]) 1 2 3 4 5 6 [torch.storage._TypedStorage(dtype=torch.int64, device=cpu) of size 6] 1497563980128 1497599557248 Trueprint(y.flatten()) print(y.storage()) print(id(y)) print(y.data_ptr()) print(y.is_contiguous())
tensor([1, 4, 2, 5, 3, 6]) 1 2 3 4 5 6 [torch.storage._TypedStorage(dtype=torch.int64, device=cpu) of size 6] 1497671954928 1497599557248 False