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))