【问题标题】:PyTorch - multiplying tensor with scalar results in zero vectorPyTorch - 将张量与标量相乘得到零向量
【发布时间】:2019-04-27 06:22:44
【问题描述】:

我不知道为什么张量的结果都是 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])

【问题讨论】:

  • 我的结果是tensor([-0.0000, -1.8421, -3.6841, -5.5262, -7.3683]),v0.4.0a0+3749c58
  • Python 版本 3.7.1

标签: python numpy pytorch


【解决方案1】:

正如评论中所写,使用 0.4.0 时获得与使用 numpy 相同的结果:

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

但是,0.4.1 我也得到了一个零向量。

原因是torch.arange(0, 10, 2)0.4.0返回一个float类型的张量,而它为0.4.1返回一个long类型的张量强>。

因此,将您的张量转换为 float 应该适合您:

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


longfloat 相乘通过重度舍入,因为结果仍然是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())

输出:

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

【讨论】:

  • 是的。你能详细说明为什么会这样吗?如果没有 .float(),我在 (math.log(10000.0) / 10) 中加/减 1,2... 会得到类似 tensor([ 0, -2, -4, -6, -8]) , 张量([0, 0, 0, 0, 0]), 张量([0, 2, 4, 6, 8])...
  • @Kuo 谢谢,我添加了更多示例以使乘法 long * float 的行为更加清晰!
猜你喜欢
  • 2020-10-14
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2019-04-21
  • 2021-03-05
  • 2021-06-17
  • 2020-08-26
  • 1970-01-01
相关资源
最近更新 更多