[解決済み] PyTorch - contiguous()は何をするのですか?
質問
githubにあるLSTM言語モデルの例を見ていました。
(リンク)
.
一般的に何をするものかは、私にはかなり明確です。しかし、私はまだ、以下を呼び出すことが何であるかを理解するのに苦労しています。
contiguous()
は、コードの中で何度も出てきます。
例えば、コードの74/75行目では、LSTMの入力配列とターゲット配列が作成されています。
データ(
ids
) は2次元であり、1次元目はバッチサイズである。
for i in range(0, ids.size(1) - seq_length, seq_length):
# Get batch inputs and targets
inputs = Variable(ids[:, i:i+seq_length])
targets = Variable(ids[:, (i+1):(i+1)+seq_length].contiguous())
そこで、簡単な例として、バッチサイズ1を使用し、かつ
seq_length
10
inputs
と
targets
はこのようになります。
inputs Variable containing:
0 1 2 3 4 5 6 7 8 9
[torch.LongTensor of size 1x10]
targets Variable containing:
1 2 3 4 5 6 7 8 9 10
[torch.LongTensor of size 1x10]
そこで一般的に私が質問したいのは
contiguous()
また、なぜそれが必要なのでしょうか?
さらに、両方の変数が同じデータで構成されているのに、なぜターゲット配列ではこのメソッドが呼び出され、入力配列では呼び出されないのかが理解できません。
どうして
targets
は不連続であり
inputs
は、まだ連続しているのでしょうか?
EDITです。
を呼び出すのを省いてみました。
contiguous()
が、損失計算時にエラーメッセージが表示されます。
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
そのため、明らかに
contiguous()
が必要です。
どのように解決するのですか?
PyTorchのテンソルには、テンソルの内容を変更せず、データの編成方法を変更する操作がいくつかあります。これらの操作は以下の通りです。
<ブロッククオート
narrow()
,
view()
,
expand()
と
transpose()
例えば、こんな感じです。
を呼び出すと
transpose()
PyTorchは新しいレイアウトのテンソルを生成するのではなく、オフセットとストライドが望ましい新しい形状を表すように、Tensorオブジェクトのメタ情報を変更するだけである。この例では、転置されたテンソルと元のテンソルは同じメモリを共有する。
x = torch.randn(3,2)
y = torch.transpose(x, 0, 1)
x[0, 0] = 42
print(y[0,0])
# prints 42
という概念が生まれたところです。
連続的
が登場します。上の例では
x
は連続しているが
y
は、ゼロから作られた同じ形状のテンソルとはメモリレイアウトが異なるため、そうではない。なお
連続した。
というのは、テンソルの中身がメモリブロックに分散しているわけではないので、少し誤解を招きやすいからである。ここでは、バイトはまだ1つのメモリブロックに割り当てられているが、要素の順序は異なっているのだ
を呼び出すと
contiguous()
このとき、テンソルは同じデータでゼロから作成されたときと同じ順序でメモリ上に配置されるように、実際にコピーを作成する。
通常、このようなことを心配する必要はありません。一般的には、すべてがうまくいくと考えて、そのあと
RuntimeError: input is not contiguous
ここで、PyTorchは連続したテンソルを期待し、そのために
contiguous()
.
関連
-
PicgoのイメージベッドツールをPythonで実装する
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] functools.wrapsの機能は何ですか?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PicgoのイメージベッドツールをPythonで実装する
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] pytorchのreshapeとviewの違いは何ですか?