私はgithub (リンク)でLSTM言語モデルのこの例を調べていました。それが一般的に何をするかは私にはかなり明白です。しかしcontiguous()
、コード内で数回発生する呼び出しが何をするのかを理解するのにまだ苦労しています。
たとえば、コードの74/75行目に、LSTMの入力シーケンスとターゲットシーケンスが作成されます。データ(に格納されているids
)は2次元であり、最初の次元はバッチサイズです。
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
それでも連続しているのでしょうか?
編集:
私は呼び出しを省略しようとしましたcontiguous()
が、これは損失を計算するときにエラーメッセージにつながります。
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
したがって、明らかcontiguous()
にこの例で呼び出す必要があります。
(これを読みやすくするために、ここに完全なコードを投稿することは避けました。上記のGitHubリンクを使用して見つけることができます。)
前もって感謝します!
tldr; to the point summary
ポイントの要約を簡潔に書くことをお勧めします。