pytorchでエラー(Leaf variable was used in an inplace operation)

タイトルに書いたエラーが出たのでわかったことをメモ

とりあえず解決に最も有用だった情報はこれ

Leaf variable has been moved into the graph interior - autograd - PyTorch Forums

生成したtensorの要素を直に書き換える処理をした上で、backwardを行うと上記のエラーが出るっぽい。自分のプログラムでもone-hotベクトルの形の入力を作る際に以下のようなことをやっていた。

input = torch.zeros([NUM_STATE], requires_grad=True)
input[state] = 1

これを以下のように書き換えたところエラーは出なくなった

input = np.zeros(NUM_STATE)
input[state] = 1
return torch.from_numpy(input).type(torch.FloatTensor)

調査中にその他調べたこと

エラーが出るのはloss.backward()を呼んだ際で、コード上ではここでエラーが出るようになっている模様。

pytorch/accumulate_grad.cpp at 372d1d67356f054db64bdfb4787871ecdbbcbe0b · pytorch/pytorch · GitHub

以下のページのVariableのところに説明があるが、grad_fnは自分で生成したtensorだとNoneに、計算によって作られたものだとそれを生成したFunctionを参照する値を持つらしい

http://caffe.classcat.com/2017/04/14/pytorch-tutorial-autograd/

また、leaf variableというのは直接生成したtensorのことを指している。

Leaf variable was used in an inplace operation - PyTorch Forums

よって、直接生成したtensorなのにgrad_fnの値がNoneではないためエラーとしているということだった。そしてこれはtensorの要素を書き換えるような処理で発生する。