Как написано в комментарии при использовании 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])