Pytorch:无法在需要毕业的变量上调用numpy()。使用var.detach()。numpy()代替

时间:2019-04-02 02:54:59

标签: python numpy pytorch

我的代码有错误,无论尝试哪种方式都无法解决。

错误很简单,我返回一个值:

id  user_id action
2   4832    click_icon
3   4832    click_image

,然后在管道中获取错误:

torch.exp(-LL_total/T_total)

诸如RuntimeError: Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead. 之类的解决方案也会出现相同的错误。

我该如何解决?谢谢。

4 个答案:

答案 0 :(得分:1)

我刚遇到这个问题 在运行 epoch 时,我将损失记录到列表中

final_losses.append(loss)

一旦我跑遍了所有的时代,我想绘制输出

plt.plot(range(epochs), final_loss)
plt.ylabel('RMSE Loss')
plt.xlabel('Epoch');

我在我的 Mac 上运行它,没有问题,但是,我需要在 Windows PC 上运行它,它产生了上面提到的错误。所以,我检查了每个变量的类型。

Type(range(epochs)), type(final_losses)
<块引用>

范围,列表

看起来应该没问题。

费了点劲才意识到 final_losses 列表是一个张量列表。然后我将它们转换为带有新列表变量 fi_los 的实际列表。

fi_los = [fl.item() for fl in final_losses ]
plt.plot(range(epochs), fi_los)
plt.ylabel('RMSE Loss')
plt.xlabel('Epoch');

成功!

答案 1 :(得分:0)

我有相同的错误消息,但是是为了在matplotlib上绘制散点图。

有两种方法可以摆脱此错误消息:

  1. 使用以下命令导入fastai.basics库:from fastai.basics import *

  2. 如果仅使用torch库,请记住使用以下命令来摘除requires_grad

    with torch.no_grad():
        (your code)
    

答案 2 :(得分:0)

重现错误

import torch

tensor1 = torch.tensor([1.0,2.0],requires_grad=True)

print(tensor1)
print(type(tensor1))

tensor1 = tensor1.numpy()

print(tensor1)
print(type(tensor1))

这将导致与行tensor1 = tensor1.numpy()完全相同的错误:

tensor([1., 2.], requires_grad=True)
<class 'torch.Tensor'>
Traceback (most recent call last):
  File "/home/badScript.py", line 8, in <module>
    tensor1 = tensor1.numpy()
RuntimeError: Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead.

Process finished with exit code 1

通用解决方案

在错误消息中建议您这样做,只需将var替换为变量名

import torch

tensor1 = torch.tensor([1.0,2.0],requires_grad=True)

print(tensor1)
print(type(tensor1))

tensor1 = tensor1.detach().numpy()

print(tensor1)
print(type(tensor1))

将按预期返回

tensor([1., 2.], requires_grad=True)
<class 'torch.Tensor'>
[1. 2.]
<class 'numpy.ndarray'>

Process finished with exit code 0

一些解释

除了实际值定义之外,您还需要将张量转换为另一个不需要梯度的张量。该其他张量可以转换为numpy数组。 cf. this discuss.pytorch post。 (我认为,更确切地说,为了从pytorch Variable包装器中取出实际张量,请参见this other discuss.pytorch post,需要这样做。)

答案 3 :(得分:0)

对于现有张量

from torch.autograd import Variable

type(y)  # <class 'torch.Tensor'>

y = Variable(y, requires_grad=True)
y = y.detach().numpy()

type(y)  #<class 'numpy.ndarray'>