RuntimeError: "exp" не реализован для "torch.LongTensor"
Я следую этому уроку: http://nlp.seas.harvard.edu/2018/04/03/attention.html
реализовать модель Transformer из статьи "Внимание - все, что вам нужно".
Однако я получаю следующую ошибку:
RuntimeError: "exp" не реализован для "torch.LongTensor"
Эта строка в классе PositionalEnconding вызывает ошибку:
div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))
Когда он здесь строится:
pe = PositionalEncoding(20, 0)
Есть идеи? Я уже пытался преобразовать это, возможно, в тип Tensor Float, но это не сработало.
Я даже загрузил весь блокнот с сопровождающими файлами, и в первоначальном учебном пособии ошибка, похоже, не устранена.
Есть идеи, что может быть причиной этой ошибки?
Спасибо!
Ответы
Ответ 1
Мне тоже пришлось следовать этому руководству.
Для меня я просто получил torch.arange
для создания тензора типа float
от
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))
Простое исправление. Но теперь это работает для меня. Возможно, что факел exp
и sin
ранее поддерживают LongTensor
но не больше (не очень уверен в этом).
Ответ 2
Кажется, что torch.arange
возвращает LongTensor
, попробуйте torch.arange(0.0, d_model, 2)
чтобы заставить факел вместо этого возвратить FloatTensor
.
Ответ 3
Предложение, данное @shai, сработало для меня. Я изменил метод init
в PositionalEncoding
, используя 0.0
в двух местах:
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))