J'allais à travers cet exemple de la LSTM modèle de langue sur github (lien).
Ce qu'il fait, en général, est assez clair pour moi. Mais j'ai encore des difficultés à comprendre ce qu'appelant contiguous()
, ce qui se produit plusieurs fois dans le code.
Par exemple, dans la ligne de 74/75 du code de l'entrée et des séquences cibles de la LSTM sont créés.
De données (stockées dans ids
) est en 2 dimensions où la première dimension est 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, comme un simple exemple, lors de l'utilisation de la taille des lots 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, qu'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 mais pas la séquence d'entrée que les deux variables sont composés des mêmes données.
Comment pourrait - targets
être uncontiguous et inputs
encore être contigus?
EDIT:
J'ai essayé de laisser de côté les appelant 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
Alors, évidemment, appelant contiguous()
dans cet exemple est nécessaire.
(Pour garder cette lisibles j'ai évité de poster le code complet ici, il peut être trouvé en utilisant le GitHub lien ci-dessus.)
Merci à l'avance!