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)
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)说的是:
1到6,我们应该采取5个步骤(或跳转)7到8,我们应该采取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()是元组,而不是列表。
根据这里的官方 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)
| 归档时间: |
|
| 查看次数: |
10329 次 |
| 最近记录: |