【问题标题】:TypeError: a float is required类型错误:需要浮点数
【发布时间】:2018-01-11 09:55:04
【问题描述】:

我有一个 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 变量转换为浮点数以便能够执行这些操作?

谢谢

【问题讨论】:

    标签: python math pytorch


    【解决方案1】:

    索引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]
    

    【讨论】:

    • 如果直接对数据张量进行索引,就不能真正省去numpy的转换吗? preds.data[4,4] 返回一个标量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多