[予約] PyTorchに隣接
出典:https://zhuanlan.zhihu.com/p/64551412
この記事は、私はコピーして貼り付けるためにここにないんだけど、非常によく書かれていた興味のある学生は、元に行くことができる、唯一の私は、クエリのためにここに来た結論の一部を抜粋します:
PyTorch提供
is_contiguous
、contiguous
(形容詞テンソルかどうかを決定するため、使用)は、それぞれ二つの方法であり、連続し、かつテンソルが確保隣接します。
is_contiguous
直感的な説明は、格納された順序テンソルテンソルと一致次元展開要素の優先順位を列内の要素の一次元アレイの下にあるかどうか。なぜ連続しましたか?
torch.view
操作方法などは、連続的なテンソルが必要です。転置、基本となる1次元配列を変更していないが並び替える操作が、新しいテンソルメタ情報、および新しいメタ情報で再割り当てストライド。
torch.view
合意された方法は、配列自体は変更されませんが、新しい形でデータを表示します。我々は転置、並び替える操作の後にビューを実行すると、Pytorchはエラーをスローします。
、転置は、並び替えるには根本的な配列を変更しないと、ビューは、実行転置が、もし入れ替え、ダイレクトコールビューの後、アレイストレージの基礎となるメモリ内の順序で返された根本的な配列に直接アクセスです:元のテキストを説明するために例を挙げ操作が表示さの順序を入れ替えた後、転置ありません
>>>t = torch.arange(12).reshape(3,4) >>>t tensor([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>>t.stride() (4, 1) >>>t2 = t.transpose(0,1) >>>t2 tensor([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]]) >>>t2.stride() (1, 4) >>>t.data_ptr() == t2.data_ptr() # 底层数据是同一个一维数组 True >>>t.is_contiguous(),t2.is_contiguous() # t连续,t2不连续 (True, False)
T2とを参照して、基礎となるデータをtは
a
次のように:[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
ただストライド、異なる形状の両方。t2.view(-1)を実行した場合、所望の次のデータを返す
b
(実際に与えられます)。[ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11]
a
新たな歩幅に基づいて使用を直接得ることができないb
、ストライド(1)を用いて、T2構造に基づいて、次に構造T2に(1、4)ストライドT2を使用し、そしてする必要性がで(12)の形状に変換されb
。しかし、このアプローチは、ビューを動作していない、根本的な配列指定された形状変形の使用にのみ表示ビューが与えられていない場合であっても、それは、データが返されます。[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
これは期待が満たされていません。使用は、
contiguous
メモリの再開放し、順次格納されるデータの基礎となる一次元展開優先順位を使用して行のT2に応じて、新しい方法テンソルT3を返します。>>>t3 = t2.contiguous() >>>t3 tensor([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]]) >>>t3.data_ptr() == t2.data_ptr() # 底层数据不是同一个一维数组 False
Tは、基礎となるデータポインタT2、T3と一致見つけることができるとt2は、実際のメモリ空間を再オープン記載矛盾基礎となるデータ・ポインタです。