PyTorch-将张量与标量相乘会得出零向量 - python

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

参考方案

正如使用 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])

Python 3运算符>>打印到文件 - python

我有以下Python代码编写项目的依赖文件。它可以在Python 2.x上正常工作,但是在使用Python 3进行测试时会报告错误。depend = None if not nmake: depend = open(".depend", "a") dependmak = open(".depend.mak&#…

在Pytorch中重复张量的特定列 - python

我有一个大小为X的pytorch张量m x n和一个长度为num_repeats的非负整数n列表(假定sum(num_repeats)> 0)。在forward()方法中,我想创建一个大小为X_dup的张量m x sum(num_repeats),其中i的列X重复num_repeats[i]次。张量X_dup将在forward()方法的下游使用,因此需…

Python:对于长时间运行的进程,通过还是休眠? - python

我正在编写一个队列处理应用程序,该应用程序使用线程等待和响应要发送到该应用程序的队列消息。对于应用程序的主要部分,只需要保持活动状态即可。对于像这样的代码示例:而True: 通过要么而True: time.sleep(1)哪一个对系统的影响最小?除了保持python应用运行外,什么都不做的首选方式是什么? 参考方案 我可以想象time.sleep()会减少系…

Python:无符号32位按位算术 - python

试图回答另一篇有关其解决方案涉及IP地址和网络掩码的文章时,我陷入了普通的按位算法。在Python中,是否存在一种标准的方式来进行按位AND,OR,XOR,NOT运算,假设输入是“32位”(可能是负数)整数或long,并且结果必须是[[ 0,2 ** 32]?换句话说,我需要一个与无符号长整数之间的C按位运算有效的Python对应物。编辑:具体问题是这样的:…

>> Python中的运算符 - python

>>运算符做什么?例如,以下操作10 >> 1 = 5有什么作用? 参考方案 它是右移运算符,将所有位“右移”一次。二进制10是1010移到右边变成0101这是5