RuntimeError: exp не реализован для torch.LongTensor

Я следую этому руководству: http://nlp.seas.harvard.edu/2018/04/03/attention.html для реализации модели Transformer из статьи "Attention Is All You Need".

Однако я получаю следующую ошибку: 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, но это не сработало.

Я даже загрузил всю записную книжку с сопутствующими файлами, и ошибка, похоже, сохраняется в исходном руководстве.

Есть идеи, что может вызвать эту ошибку?

Спасибо!


person noob    schedule 22.10.2018    source источник
comment
Что такое d_model в коде?   -  person Akhilesh Pandey    schedule 22.10.2018
comment
@AkhileshPandey d_model - один из параметров для инициализации класса PositionalEncoding: def __init __ (self, d_model, dropout, max_len = 5000): Также весь блокнот можно найти здесь: github.com/harvardnlp/annotated-transformer/blob/master/   -  person noob    schedule 22.10.2018
comment
После просмотра кода я обнаружил, что в какой-то момент значение d_model было 20. Используя это значение, я обнаружил, что строка у меня работает нормально.   -  person Akhilesh Pandey    schedule 22.10.2018
comment
Попробуйте преобразовать его в какой-либо другой тип, например a = a.type (torch.float36), затем вызовите torch.exp (a)   -  person Akhilesh Pandey    schedule 22.10.2018
comment
Я запустил код, и он у меня отлично работает. Просто посмотрите, правильно ли вы скопировали.   -  person Akhilesh Pandey    schedule 22.10.2018
comment
@noob Привет, парень, я пытаюсь запустить это руководство, и у меня была такая же проблема. После применения исправления у меня возникла куча других подобных проблем, которые я исправил, вызвав float() для некоторых тензоров и преобразовав их в FloatTensors. Но теперь я получаю эту ошибку: Floating point exception: 8 и python завершает работу. Мне было интересно, была ли у вас такая же проблема. Если вы этого не сделали, что вы сделали, чтобы исправить те другие проблемы с типом поплавка?   -  person user2268997    schedule 01.12.2018


Ответы (5)


Я тоже следил за этим уроком.

Для меня я только что получил torch.arange для генерации тензора типа с плавающей запятой

из

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

to

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, но больше не поддерживают (не очень уверен в этом).

person LU Jialin    schedule 22.10.2018
comment
Большое спасибо и добро пожаловать в Stack overflow! :) - person noob; 22.10.2018

Похоже, что torch.arange возвращает LongTensor, попробуйте torch.arange(0.0, d_model, 2) заставить torch вместо этого вернуть FloatTensor.

person Shai    schedule 22.10.2018
comment
Привет, спасибо за ответ! Но это, похоже, не работает :( - person noob; 22.10.2018
comment
@noob, вы уверены, что эта строка вызывает эту ошибку? можете ли вы проверить (при отладке), что dtype из torch.arage(0, d_model, 2) действительно float, а не long? - person Shai; 22.10.2018

Предложение @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))
person user214581    schedule 04.01.2019
comment
Для меня также (тот же учебник; код скопирован в * .py script): необходимо поменять 0, на 0.0,, как указано выше. :-) - person Victoria Stuart; 29.08.2019

Для меня установка pytorch == 1.7.1 решила проблему.

person razimbres    schedule 16.02.2021

Как сказал Рубенс, в более поздней версии Pytorch вам не нужно беспокоиться об этом. Я могу легко запустить его на своем настольном компьютере Pytorch 1.8.0, но не смог выполнить его на моем сервере 1.2.0 Pytorch. Между разными версиями есть что-то несовместимое.

person Fang WU    schedule 08.03.2021