タイトルに書いたエラーが出たのでわかったことをメモ
とりあえず解決に最も有用だった情報はこれ
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の要素を書き換えるような処理で発生する。