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_length
10 inputs
i targets
wyglą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 targets
być nieciągłe i inputs
nadal 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 summary
zwięzłe do punktacji podsumowanie.