PyTorch - тензор умножения со скалярным результатом в нулевом векторе - PullRequest
0 голосов
/ 25 ноября 2018

Понятия не имею, почему результат равен 0 с тензором.Здесь что-то не так?

>>> import torch
>>> import numpy as np
>>> import math

>>> torch.__version__
'0.4.1'
>>> np.__version__
'1.15.4'

>>> torch.arange(0, 10, 2) *-(math.log(10000.0) / 10)
tensor([0, 0, 0, 0, 0])
>>> np.arange(0, 10, 2) *-(math.log(10000.0) / 10)
array([-0.        , -1.84206807, -3.68413615, -5.52620422, -7.3682723 ])

>>> torch.arange(0, 10, 2)
tensor([0, 2, 4, 6, 8])
>>> np.arange(0, 10, 2)
array([0, 2, 4, 6, 8])

1 Ответ

0 голосов
/ 25 ноября 2018

Как написано в комментарии при использовании 0.4.0 , получить те же результаты, что и с numpy:

tensor([-0.0000, -1.8421, -3.6841, -5.5262, -7.3683])

Однако с 0.4.1 я тоже получаю нулевой вектор.

Причина этого в том, что torch.arange(0, 10, 2) возвращает тензор типа float для 0.4.0 , в то время как он возвращает тензор типа long для 0.4.1.

Так что приведение вашего тензора к float должно работать на вас:

torch.arange(0, 10, 2).float() *-(math.log(10000.0) / 10)


Умножение long и float работает при сильном округлении,в результате все еще остается тензор типа long.Таким образом, при преобразовании FloatTensor в LongTensor значения от -1 до 1 будут округлены до 0.

Поскольку -(math.log(10000.0) / 10) приводит к -0.9210340371976183, ваш результат равен 0.Таким образом, -0.9210340371976183 перед умножением преобразуется в тип long.Но при преобразовании оно будет округлено до 0, см. Этот пример:

t = torch.tensor((-(math.log(10000.0) / 10)))
print('FloatTensor:', t)
print('Converted to Long:', t.long())

Outout:

FloatTensor: tensor(-0.9210)
Converted to Long: tensor(0)

Таким образом:

torch.arange(0, 10, 2).float() *-(math.log(10000.0) / 10)

становится:

torch.arange(0, 10, 2).float() * 0

Следовательно, в результате вы получите тензор нулей.



Еще несколько примеров:

Если вы умножите его на значение от 1 до 2, скажем, 1.7, оно всегда будет округлено до 1:

t = torch.tensor(range(5), dtype=torch.long)
print(t)
print(t * 1.7)

Вывод:

tensor([ 0,  1,  2,  3,  4])
tensor([ 0,  1,  2,  3,  4])

И аналогичноумножение на 2.7 приводит к эффективному умножению 2:

t = torch.tensor(range(5), dtype=torch.long)
print(t)
print(t * 2.7)

Выход:

tensor([ 0,  1,  2,  3,  4])
tensor([ 0,  2,  4,  6,  8])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...