Przeglądałem ten przykład modelu języka LSTM na github (link) . Ogólnie rzecz biorąc, jest dla mnie całkiem jasne. Ale wciąż staram się zrozumieć, co contiguous()robi wywołanie , co występuje kilka razy w kodzie.
Na przykład w linii 74/75 kodu wejściowego i sekwencji docelowej LSTM są tworzone. Dane (przechowywane w ids) są dwuwymiarowe, gdzie pierwszy wymiar to rozmiar partii.
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())
A więc jako prosty przykład, gdy używasz rozmiaru partii 1 i seq_length10 inputsi targetswygląda to tak:
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]
Więc ogólnie moje pytanie brzmi: co contiguous()i dlaczego tego potrzebuję?
Ponadto nie rozumiem, dlaczego metoda jest wywoływana dla sekwencji docelowej, a nie dla sekwencji wejściowej, ponieważ obie zmienne zawierają te same dane.
Jak mogłoby targetsbyć nieciągłe i inputsnadal przylegać do siebie?
EDYCJA:
Próbowałem pominąć wywołanie contiguous(), ale prowadzi to do komunikatu o błędzie podczas obliczania straty.
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
Więc oczywiście wezwanie contiguous()w tym przykładzie jest konieczne.
(Aby zachować czytelność, unikałem publikowania tutaj pełnego kodu, można go znaleźć, korzystając z powyższego linku GitHub).
Z góry dziękuję!

tldr; to the point summaryzwięzłe do punktacji podsumowanie.