web-dev-qa-db-ja.com

layout = torch.stridedはどういう意味ですか?

Pytorchのドキュメントを調べていると、多くの関数でlayout = torch.stridedという用語に出くわしました。どこでどのように使用されているかを理解するのを手伝ってくれる人はいますか?説明には、返されたTensorの望ましいレイアウトであると記載されています。レイアウトとは何ですか?レイアウトには何種類ありますか?

torch.Rand(*sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
5

stridesは、特定の次元で、ある要素から次の要素に移動するために必要なステップ(またはジャンプ)の数です。コンピュータメモリでは、データはメモリの連続したブロックに線形に保存されます。私たちのviewは単なる(再)表現です。

これを理解するためのテンソルの例を見てみましょう:

_# 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に沿ってトラバースする番目 次元/軸、_1_から_6_にjumpしたい場合、5つのステップ(またはジャンプ)を実行する必要があります
  • に沿って横断する1st 次元/軸、_7_から_8_にjumpしたい場合、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
_

その理解に伴い、テンソルを作成するときにこれ追加のパラメーターが必要な理由を尋ねる必要があるかもしれません。これに対する答えは、効率上の理由によるものです。 (どうすれば(疎)テンソルの要素を最も効率的に格納/読み取り/アクセスできますか?)。

sparse tensors(ほとんどの要素がゼロのみであるテンソル)では、これらの値を保存したくありません。ゼロ以外の値とそのインデックスのみを保存します。希望する形状で、残りの値をゼロで埋めて、希望する疎テンソルを得ることができます。


これについてさらに読むには、以下の記事が役立つかもしれません。


P.S:_torch.layout_のドキュメントにタイプミスがあると思います

ストライドは整数のリストです...

tensor.stride()によって返される複合データ型は、リストではなくタプルです。

1
kmario23

すぐに理解できるように、layout=torch.strideddenseテンソルに対応し、layout=torch.sparse_coosparseテンソルに対応します。

別の観点から見ると、 torch.tensor.view と一緒に理解できます。テンソルを見ることができることは、それが隣接していることを示します。テンソルのビューを変更すると、それに応じてストライドも変更されますが、データは同じままです。より具体的には、viewはデータが同じで形状が異なる新しいテンソルを返し、stridesviewと互換性があり、メモリ内のデータにアクセスする方法を示します。

例えば

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.stridedの考え方は、基本的にnumpyのストライドと同じです。詳細については、この質問をご覧ください。 素人の派手なストライドを理解するには?

0
drowsyleilei

公式のpytorchドキュメント here によると、

Torch.layoutは、torch.Tensorのメモリレイアウトを表すオブジェクトです。現在、私たちはtorch.strided(密なテンソル)をサポートしており、 torch.sparse_coo (スパースCOOテンソル)を実験的にサポートしています。

torch.stridedは密なテンソルを表し、最も一般的に使用されるメモリレイアウトです。各ストライドテンソルには、データを保持する関連するtorch.Storageがあります。これらのテンソルは、ストレージの多次元のストライドビューを提供します。ストライドは整数のリストです。k番目のストライドは、テンソルのk番目の次元の1つの要素から次の要素に移動するために必要なメモリ内のジャンプを表します。この概念により、多くのテンソル演算を効率的に実行できます。

例:

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

>>> x.t().stride()
(1, 5)
0
Anubhav Singh