Python 布局=火炬跨步意味着什么?
在阅读pytorch文档时,我在许多函数中遇到了一个术语Python 布局=火炬跨步意味着什么?,python,multidimensional-array,pytorch,tensor,numpy-ndarray,Python,Multidimensional Array,Pytorch,Tensor,Numpy Ndarray,在阅读pytorch文档时,我在许多函数中遇到了一个术语layout=torch.strip。有谁能帮助我理解它在哪里使用以及如何使用。描述说这是返回张量的理想布局。布局是什么意思?有多少种类型的布局 torch.rand(*sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) 根据pytorch官方文件 torch.layout是一个对象,表示 张量。目前,我们支持torch.
layout=torch.strip
。有谁能帮助我理解它在哪里使用以及如何使用。描述说这是返回张量的理想布局。布局是什么意思?有多少种类型的布局
torch.rand(*sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
根据pytorch官方文件 torch.layout是一个对象,表示 张量。目前,我们支持torch.stripped(稠密张量)和 对(稀疏COO张量)有实验支持 torch.stread表示密集张量,是 是最常用的。每个跨步张量都有一个相关的 保存数据的存储器。这些张量提供了 存储的多维、跨视图。跨步是一个列表 整数:第k步表示内存中必要的跳跃 从元素的第k维中的一个元素转到下一个元素 张量。这个概念使得执行许多张量运算成为可能 运营效率高 例如:
>>> x = torch.Tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> x.stride()
(5, 1)
>>> x.t().stride()
(1, 5)
strips
是给定维度中从一个元素到下一个元素所需的步数(或跳跃)。在计算机内存中,数据线性存储在连续的内存块中。我们所看到的只是一个(重新)展示
让我们以张量为例来理解这一点:
# a 2D tensor
In [62]: tensor = torch.arange(1, 16).reshape(3, 5)
In [63]: tensor
Out[63]:
tensor([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]])
有了这个张量,步幅是:
# get the strides
In [64]: tensor.stride()
Out[64]: (5, 1)
这个结果元组(5,1)
表示:
- 要沿第0维/轴(Y轴)进行遍历,假设我们要从
跳到1
,我们应该采取5个步骤(或跳)6
- 要沿着第一个维度/轴(X轴)进行遍历,假设我们要从
跳到7
,我们应该采取1步(或跳)8
5
和1
的顺序(或索引)表示维度/轴。您还可以将需要步幅的尺寸作为参数传递:
# get stride for axis 0
In [65]: tensor.stride(0)
Out[65]: 5
# get stride for axis 1
In [66]: tensor.stride(1)
Out[66]: 1
有了这样的理解,我们可能会问,为什么在创建张量时需要这个额外的参数?答案是出于效率原因。(我们如何才能最有效地存储/读取/访问(稀疏)张量中的元素?) 使用稀疏张量(大多数元素都是零的张量),所以我们不想存储这些值。我们只存储非零值及其索引。对于所需的形状,其余的值可以用零填充,从而生成所需的稀疏张量
对于这方面的进一步阅读,以下文章可能会有所帮助:
p.S:我想在
torch.layout
文档中有一个打字错误,上面写着
步幅是一个整数列表
tensor.stride()
返回的复合数据类型是元组,而不是列表。为了快速理解,layout=torch.stripped
对应密集张量,而layout=torch.sparse\u coo
对应稀疏张量
从另一个角度,我们可以一起理解它。
可以看到张量表示它是连续的。如果我们改变张量的视图,步幅将相应地改变,但数据将保持不变。更具体地说,视图
返回具有相同数据但形状不同的新张量,跨步
与视图
兼容,以指示如何访问内存中的数据
比如说
In [1]: import torch
In [2]: a = torch.arange(15)
In [3]: a.data_ptr()
Out[3]: 94270437164688
In [4]: a.stride()
Out[4]: (1,)
In [5]: a = a.view(3, 5)
In [6]: a.data_ptr() # share the same data pointer
Out[6]: 94270437164688
In [7]: a.stride() # the stride changes as the view changes
Out[7]: (5, 1)
此外,torch.striped
的概念与numpy中的stripes基本相同。
查看此问题以获得更详细的理解。