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帖子)。
Ric*_*ais 18
我有同样的错误消息,但它是为了在 matplotlib 上绘制散点图。
有 2 个步骤我可以摆脱此错误消息:
使用以下命令导入fastai.basics
库:from fastai.basics import *
如果你只使用torch
库,记得去掉requires_grad
with :
with torch.no_grad():
(your code)
Run Code Online (Sandbox Code Playgroud)
小智 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)
成功!