TypeError: a float is required

TypeError: a float is required

我有一个 pytorch 变量:

preds[4,4]
Out[305]: 
Variable containing:
-96.7809
[torch.cuda.FloatTensor of size 1 (GPU 0)]

我想做以下事情:

 import math
 x=preds[4,4]
 y=maths.exp(x)
 z= y / (y+1)

但是当我这样做时:

y=maths.exp(x)

我得到以下错误:

   math.exp(preds[4,4])
TypeError: a float is required

如何将 torch 变量转换为浮点数以便能够执行这些操作?

谢谢

索引 Variable 对象不会将其转换为标量。它仍然是一个 Variable 对象。但是索引 numpy array 确实如此。因此,将 Variable 对象转换为 numpy,然后按照您希望的方式进行索引应该可以解决问题。

但是在将 Variable 转换为 numpy 时会遇到一些小问题。

如果preds是存储在cpu内存中的Variable,你可以简单地这样做。

nparr = preds.data.numpy()
x = nparr[4, 4] 

但是,如果 preds 在 gpu 内存中,则必须先将 Variable 传输到 cpu 内存中,然后再将其转换为 numpy 对象,如下所示:

preds = preds.cpu()

然后同上。

nparr = preds.data.numpy()
x = nparr[4, 4]

在这两种情况下,x 都是一个标量(在您的情况下是一个浮点数),您可以在您选择的任何数学运算中使用它。

编辑:

是的,@mexmex 是对的,您也可以直接索引包含在 Variable 中的 tensor 以提取任何给定索引处的标量值。

像这样:

 x = preds.data[4, 4]