Stavo esaminando questo esempio di un modello di linguaggio LSTM su GitHub (collegamento) . Quello che fa in generale è abbastanza chiaro per me. Ma sto ancora lottando per capire cosa contiguous()
fa la chiamata , che si verifica più volte nel codice.
Ad esempio, nella riga 74/75 del codice di input e vengono create le sequenze di destinazione dell'LSTM. I dati (memorizzati ids
) sono bidimensionali dove la prima dimensione è la dimensione del batch.
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())
Quindi, come semplice esempio, quando si utilizzano batch di dimensioni 1 e seq_length
10 inputs
e si targets
presenta così:
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]
Quindi, in generale, la mia domanda è: cosa serve contiguous()
e perché ne ho bisogno?
Inoltre non capisco perché il metodo viene chiamato per la sequenza di destinazione e ma non per la sequenza di input poiché entrambe le variabili sono composte dagli stessi dati.
Come potrebbe targets
essere non contiguo ed inputs
essere ancora contiguo?
EDIT:
ho provato a tralasciare la chiamata contiguous()
, ma questo porta a un messaggio di errore durante il calcolo della perdita.
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
Quindi ovviamente contiguous()
è necessario chiamare questo esempio.
(Per mantenerlo leggibile ho evitato di pubblicare il codice completo qui, può essere trovato usando il collegamento GitHub sopra.)
Grazie in anticipo!
tldr; to the point summary
sommario conciso con il punto.