私は 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()
にこの例で呼び出す必要があります。