Ich habe dieses Beispiel eines LSTM-Sprachmodells auf Github (Link) durchgearbeitet . Was es im Allgemeinen macht, ist mir ziemlich klar. Aber ich habe immer noch Schwierigkeiten zu verstehen, was das Aufrufen contiguous()
bewirkt, was im Code mehrmals vorkommt.
Beispielsweise werden in Zeile 74/75 der Codeeingabe und Zielsequenzen des LSTM erstellt. Daten (gespeichert in ids
) sind zweidimensional, wobei die erste Dimension die Stapelgröße ist.
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())
So wie ein einfaches Beispiel, bei der Verwendung von Losgröße 1 und seq_length
10 inputs
und targets
sieht wie folgt aus :
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]
Im Allgemeinen ist meine Frage also, was macht contiguous()
und warum brauche ich es?
Außerdem verstehe ich nicht, warum die Methode für die Zielsequenz und nicht für die Eingabesequenz aufgerufen wird, da beide Variablen aus denselben Daten bestehen.
Wie könnte es targets
nicht zusammenhängend und inputs
dennoch zusammenhängend sein?
BEARBEITEN:
Ich habe versucht, das Anrufen wegzulassen contiguous()
, aber dies führt zu einer Fehlermeldung bei der Berechnung des Verlusts.
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
Daher ist es offensichtlich contiguous()
notwendig, dieses Beispiel aufzurufen .
(Um dies lesbar zu halten, habe ich es vermieden, den vollständigen Code hier zu veröffentlichen. Er kann über den obigen GitHub-Link gefunden werden.)
Danke im Voraus!
tldr; to the point summary
mit einer kurzen Zusammenfassung des Punktes.