web-dev-qa-db-ja.com

Pytorch:gradを必要とする変数でnumpy()を呼び出せません。代わりにvar.detach()。numpy()を使用してください

コードにエラーがあり、どの方法でも修正できません。

エラーは単純です。値を返します。

_torch.exp(-LL_total/T_total)
_

後でパイプラインでエラーを取得します。

_RuntimeError: Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead.
_

cpu().detach().numpy()などのソリューションでも同じエラーが発生します。

どうすれば修正できますか?ありがとう。

10
tstseby

エラー再現

_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
_

いくつかの説明

実際の値の定義に加えて、勾配を必要としない別のテンソルにテンソルを変換する必要があります。この他のテンソルは、派手な配列に変換できます。 Cf. これについては.pytorchの投稿 。 (より正確には、pytorch Variableラッパーから実際のテンソルを取得するためにそうする必要があると思います。cf。 this other Discussion.pytorch post を参照)。

8
Blupon

同じエラーメッセージが表示されましたが、matplotlibで散布図を描画するためのものでした。

このエラーメッセージから抜け出す方法は2つあります。

  1. fastai.basicsライブラリと:from fastai.basics import *

  2. torchライブラリのみを使用する場合は、requires_grad with:

    with torch.no_grad():
        (your code)
    
8
Rickantonais