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_length10 inputse si targetspresenta 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 targetsessere non contiguo ed inputsessere 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 summarysommario conciso con il punto.