#事の経緯
基本的なネットワークであれば
output = net(input)
loss = loss_fn(output)
optimizer.zero_grad()
loss.backward()
optimizer.step()
このように、5行で終わってしまう誤差逆伝播ですが、このbackward()が使えるのは
Tensorがスカラーの時です。
諸事情があり、多次元のTensorを使って勾配を繋げ、Autogradしたいとします。(笑)
(すなわち、勾配の一部を外部ライブラリに依存する形で求めたがために、Autogardの始点がスカラーでなくなってしまった時)
チェインルールで計算するため、勾配をAutogradに渡すやり方を説明します。
色々調べた結果以下
#やりかた
output = net(input)
##(なんらかの処理で、勾配を求める)##
##(some_function内では外部ライブラリに依存した処理が行われており)##
##(autogradが適用出来ない)##
outputGrad = some_function(output, ground_Truth)
optimizer.zero_grad()
torch.autograd.backward([output], [outputGrad])
optimizer.step()
これで勾配を渡すことが出来ます
事情が分かる人には分かると思います。。。(笑)