この記事は, Pythonを利用して研究を行なっていく中で私がつまずいてしまったポイントをまとめていくものです。同じような状況で苦しんでいる方々の参考になれば嬉しいです。Pythonつまずきポイント集の目次は以下のページをご覧ください。
【超初心者お悩み解決】Pythonつまずきポイント記事まとめページ
この記事は,Pythonを利用して研究を行なっていく中で私がつまずいてしまったポイントをまとめていくものです。同じような状況で苦しんで...
スポンサーリンク
環境
●Ubuntu 18.04
●Python 3.7.3
●conda 4.8.3
●pytorch 1.2.0
現象
「the derivative for ‘target’ is not implemented」というエラーに怒られる。
原因
binary_cross_entropyのラベル側に勾配を保持したテンソルを渡していたことが原因でした。labelには勾配を保持していない状態(requires_grad=False)のテンソルを渡す必要があります。
よくあるパターンは,計算をした結果勾配が保持された状態のsoft labelが得られて,それをlabelとして突っ込んでいるものです。Gumbel Softmaxなどを利用して擬似的にsoft-labelをhard-labelにしたときも,勾配は保持されたままですので,同様のエラーが起きます。
最も簡単な回避策は,「.detach()」を利用して勾配情報を捨ててしまうことです。
# yはNNの出力
# tは勾配を保持したラベル
# Before
criterion = nn.functional.binary_cross_entropy
loss = criterion(y, t)
# After
criterion = nn.functional.binary_cross_entropy
loss = criterion(y, t.detach())