[予約] PyTorchに隣接

[予約] PyTorchに隣接

出典:https://zhuanlan.zhihu.com/p/64551412

この記事は、私はコピーして貼り付けるためにここにないんだけど、非常によく書かれていた興味のある学生は、元に行くことができる、唯一の私は、クエリのためにここに来た結論の一部を抜粋します:

PyTorch提供is_contiguouscontiguous(形容詞テンソルかどうかを決定するため、使用)は、それぞれ二つの方法であり、連続し、かつテンソルが確保隣接します。

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は、実際のメモリ空間を再オープン記載矛盾基礎となるデータ・ポインタです。

おすすめ

転載: www.cnblogs.com/jiading/p/11982023.html