Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 布局=火炬跨步意味着什么?_Python_Multidimensional Array_Pytorch_Tensor_Numpy Ndarray - Fatal编程技术网

Python 布局=火炬跨步意味着什么?

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.

在阅读pytorch文档时,我在许多函数中遇到了一个术语
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
    跳到
    6
    ,我们应该采取5个步骤(或跳)
  • 要沿着第一个维度/轴(X轴)进行遍历,假设我们要从
    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

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

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


对于这方面的进一步阅读,以下文章可能会有所帮助:


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基本相同。 查看此问题以获得更详细的理解。