layout = torch.strided 是什么意思?

Bha*_*ary 12 python multidimensional-array pytorch tensor numpy-ndarray

当我浏览 pytorch 文档时,我layout = torch.strided在许多函数中遇到了一个术语。任何人都可以帮助我了解它在哪里使用以及如何使用。描述说这是返回的 Tensor 所需的布局。布局是什么意思,有多少种布局?

torch.rand(*sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
Run Code Online (Sandbox Code Playgroud)

kma*_*o23 8

strides是在给定维度中从一个元素到下一个元素所需的步骤(或跳转)数。在计算机内存中,数据线性存储在连续的内存块中。我们所看到的只是一个(重新)展示。

让我们举一个例子张量来理解这一点:

# 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]])
Run Code Online (Sandbox Code Playgroud)

有了这个张量,步幅是:

# get the strides
In [64]: tensor.stride() 
Out[64]: (5, 1)
Run Code Online (Sandbox Code Playgroud)

这个结果元组(5, 1)说的是:

  • 沿横向0尺寸/轴(Y轴),让我们说,我们要16,我们应该采取5个步骤(或跳转)
  • 沿横向1尺寸/轴(X轴),让我们说,我们要78,我们应该采取1步(或跳转)

元组中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
Run Code Online (Sandbox Code Playgroud)

有了这样的理解,我们可能要问为什么在创建张量时需要这个额外的参数?答案是出于效率原因。(我们如何最有效地存储/读取/访问(稀疏)张量中的元素?)。

使用稀疏张量(大多数元素都为零的张量),所以我们不想存储这些值。我们只存储非零值及其索引。对于所需的形状,其余的值可以用零填充,从而产生所需的稀疏张量。


为了进一步阅读,以下文章可能会有所帮助:


PS:我猜torch.layout文档中有一个错字,上面写着

步幅是一个整数列表......

返回的复合数据类型tensor.stride()是元组,而不是列表。


Anu*_*ngh 0

根据这里的官方 pytorch 文档,

torch.layout 是一个表示 torch.Tensor 的内存布局的对象。目前,我们支持 torch.strided(密集张量),并对torch.sparse_coo (稀疏 COO 张量)提供实验支持。

torch.strided 表示密集张量,是最常用的内存布局。每个跨步张量都有一个关联的 torch.Storage,用于保存其数据。这些张量提供了存储的多维、跨步视图。步长是一个整数列表:第 k 个步长表示在张量的第 k 维中从一个元素到下一个元素所需的内存跳转。这个概念使得高效地执行许多张量运算成为可能。

例子:

>>> x = torch.Tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> x.stride()
(5, 1)

>>> x.t().stride()
(1, 5)
Run Code Online (Sandbox Code Playgroud)