アカデミック

【Pythonお悩み解決】「the derivative for ‘target’ is not implemented」というエラーについて

この記事は, Pythonを利用して研究を行なっていく中で私がつまずいてしまったポイントをまとめていくものです。同じような状況で苦しんでいる方々の参考になれば嬉しいです。Pythonつまずきポイント集の目次は以下のページをご覧ください。

【超初心者お悩み解決】Pythonつまずきポイント記事まとめページ この記事は,Pythonを利用して研究を行なっていく中で私がつまずいてしまったポイントをまとめていくものです。同じような状況で苦しんで...

本記事で紹介する解決策がBestという保証はできません。正確な情報を発信するように心掛けていますが図らずも誤った情報を記載してしまう場合があります。もしご指摘等がありましたら,コメント欄またはお問い合わせページよりご連絡下さい。

環境

●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())

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です