Pytorchのドキュメントを調べていると、多くの関数でlayout = torch.strided
という用語に出くわしました。どこでどのように使用されているかを理解するのを手伝ってくれる人はいますか?説明には、返されたTensorの望ましいレイアウトであると記載されています。レイアウトとは何ですか?レイアウトには何種類ありますか?
torch.Rand(*sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
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)
_は次のように言っています。
1
_から_6
_にjumpしたい場合、5つのステップ(またはジャンプ)を実行する必要があります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()
によって返される複合データ型は、リストではなくタプルです。
すぐに理解できるように、layout=torch.strided
はdenseテンソルに対応し、layout=torch.sparse_coo
はsparseテンソルに対応します。
別の観点から見ると、 torch.tensor.view と一緒に理解できます。テンソルを見ることができることは、それが隣接していることを示します。テンソルのビューを変更すると、それに応じてストライドも変更されますが、データは同じままです。より具体的には、view
はデータが同じで形状が異なる新しいテンソルを返し、strides
はview
と互換性があり、メモリ内のデータにアクセスする方法を示します。
例えば
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のストライドと同じです。詳細については、この質問をご覧ください。 素人の派手なストライドを理解するには?
公式の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)