Je passais par cet exemple de modèle de langage LSTM sur github (lien) . Ce qu'il fait en général est assez clair pour moi. Mais j'ai encore du mal à comprendre ce que fait l'appel contiguous()
, ce qui se produit plusieurs fois dans le code.
Par exemple, à la ligne 74/75 du code d'entrée et des séquences cibles du LSTM sont créées. Les données (stockées dans ids
) sont bidimensionnelles, la première dimension étant la taille du lot.
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())
Donc, à titre d'exemple simple, lorsque vous utilisez la taille de lot 1 et seq_length
10 inputs
et targets
ressemble à ceci:
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]
Donc, en général, ma question est la suivante: qu'est-ce que c'est contiguous()
et pourquoi en ai-je besoin?
De plus, je ne comprends pas pourquoi la méthode est appelée pour la séquence cible et non pour la séquence d'entrée, car les deux variables sont composées des mêmes données.
Comment pourrait targets
être non contigu et inputs
toujours contigu?
EDIT:
J'ai essayé de ne pas appeler contiguous()
, mais cela conduit à un message d'erreur lors du calcul de la perte.
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
Il est donc évidemment contiguous()
nécessaire d' appeler cet exemple.
(Pour garder cela lisible, j'ai évité de publier le code complet ici, il peut être trouvé en utilisant le lien GitHub ci-dessus.)
Merci d'avance!
tldr; to the point summary
résumé concis au point.