web-dev-qa-db-fra.com

RuntimeError: "exp" non implémenté pour 'torch.LongTensor'

Je suis ce tutoriel: http://nlp.seas.harvard.edu/2018/04/03/attention.html Pour implémenter le modèle Transformer à partir du document "L’attention est tout ce dont vous avez besoin". 

Toutefois, l'erreur suivante s'affiche: RuntimeError: "exp" non implémenté pour 'torch.LongTensor'

C'est la ligne, dans la classe PositionalEnconding, qui cause l'erreur:

div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))

Quand il est construit ici: 

pe = PositionalEncoding(20, 0)

Des idées?? J'ai déjà essayé de convertir ceci en peut-être un type Tensor Float, mais cela n'a pas fonctionné.

J'ai même téléchargé tout le bloc-notes avec les fichiers d'accompagnement et l'erreur semble persister dans le didacticiel d'origine.

Des idées ce qui peut causer cette erreur? 

Merci!

5
noob

Il m'est arrivé de suivre ce tutoriel aussi. 

Pour moi, je viens de recevoir le torch.arange pour générer un tenseur de type float

de 

position = torch.arange(0, max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))

à

position = torch.arange(0., max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0., d_model, 2) * -(math.log(10000.0) / d_model))

Juste une solution simple. Mais maintenant cela fonctionne pour moi. Il est possible que les flambeaux exp et sin aient précédemment pris en charge LongTensor mais plus maintenant (pas très sûr de cela).

13
LU Jialin

Il semble que torch.arange retourne une LongTensor, essayez torch.arange(0.0, d_model, 2) pour forcer la torche à renvoyer une FloatTensor à la place.

2
Shai

La suggestion donnée par @shai a fonctionné pour moi. J'ai modifié la méthode init de PositionalEncoding en utilisant 0.0 à deux endroits:

position = torch.arange(0.0, max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0.0, d_model, 2) * -(math.log(10000.0) / d_model))
0
user214581