Eu estava examinando este exemplo de um modelo de linguagem LSTM no github (link) . O que ele faz em geral é bastante claro para mim. Mas ainda estou lutando para entender o que a chamada contiguous()
faz, o que ocorre várias vezes no código.
Por exemplo, na linha 74/75 da entrada de código e as sequências de destino do LSTM são criadas. Os dados (armazenados em ids
) são bidimensionais, onde a primeira dimensão é o tamanho do lote.
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())
Portanto, como um exemplo simples, ao usar os tamanhos de lote 1 e seq_length
10 inputs
e se targets
parecer com isto:
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]
Então, em geral, minha pergunta é: o que é contiguous()
e por que preciso disso?
Além disso, não entendo por que o método é chamado para a sequência de destino e não a sequência de entrada, pois ambas as variáveis são compostas dos mesmos dados.
Como pode targets
ser não contíguo e inputs
ainda assim ser contíguo?
EDIT:
Tentei deixar de ligar contiguous()
, mas isso leva a uma mensagem de erro ao calcular a perda.
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
Então, obviamente, chamar contiguous()
neste exemplo é necessário.
(Para manter isso legível, evitei postar o código completo aqui, ele pode ser encontrado usando o link do GitHub acima.)
Desde já, obrigado!
tldr; to the point summary
com um resumo conciso e direto ao ponto.