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

tst*_*eby 6 python numpy pytorch

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

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

torch.exp(-LL_total/T_total)
Run Code Online (Sandbox Code Playgroud)

然后在管道中获取错误:

RuntimeError: Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead.
Run Code Online (Sandbox Code Playgroud)

诸如此类的解决方案cpu().detach().numpy()也会出现相同的错误。

我该如何解决?谢谢。

Blu*_*pon 27

 错误重现

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))
Run Code Online (Sandbox Code Playgroud)

这导致该行完全相同的错误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
Run Code Online (Sandbox Code Playgroud)

通用解决方案

这是在您的错误消息中向您建议的,只需替换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))
Run Code Online (Sandbox Code Playgroud)

按预期返回

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

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)

一些解释

您需要将您的张量转换为另一个除了其实际值定义之外不需要梯度的张量。这个其他张量可以转换为一个 numpy 数组。参见 这个讨论.pytorch 帖子。(我认为,更准确地说,需要这样做才能从 pytorchVariable包装器中获取实际张量,参见其他讨论。pytorch帖子)。

  • 这在 fast.ai 的第二个教程中发生在我身上。在这种情况下,不是直接使用 nn.Parameter 变量进行绘图,而是将分离的变量复制到单独的张量中并绘制它们解决了问题。 (3认同)

Ric*_*ais 18

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

有 2 个步骤我可以摆脱此错误消息:

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

  2. 如果你只使用torch库,记得去掉requires_gradwith :

    with torch.no_grad():
        (your code)
    
    Run Code Online (Sandbox Code Playgroud)

  • 这是 1 种方式 2 个步骤,而不是 2 种方式。 (5认同)

小智 6

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

final_losses.append(loss)
Run Code Online (Sandbox Code Playgroud)

一旦我跑完了所有的纪元,我想绘制输出图

plt.plot(range(epochs), final_loss)
plt.ylabel('RMSE Loss')
plt.xlabel('Epoch');
Run Code Online (Sandbox Code Playgroud)

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

Type(range(epochs)), type(final_losses)
Run Code Online (Sandbox Code Playgroud)

范围、列表

看起来应该没问题。

花了一点时间才意识到 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');
Run Code Online (Sandbox Code Playgroud)

成功!