2017-06-02 7 views
0

TorchでClassNLLCriterionを変更したカスタム損失関数を作成したいとします。具体的には、ClassNLLCriterion損失は次のとおりです。Torch基準を変更する

loss(x, class) = -x[class] 

私はこれがあることを変更したい:Kはネットワーク入力の機能、NOTネットワークの重みやネットワークの出力である

loss(x, class) = -x[class]*K 

。したがって、Kは定数として扱うことができます。

このカスタム条件を実装する最も簡単な方法は何ですか? updateOutput()機能は簡単ですが、updateGradInput()機能を変更するにはどうすればよいですか?

答えて

1

基本的にあなたの損失関数Lは、入力とターゲットの関数です。したがって、あなたは新しい損失を正しく理解している場合、

loss(input, target) = ClassNLLCriterion(input, target) * K 

があります。そして、あなたは(

updateGradInput[ClassNLLCriterion](input, target) * K + ClassNLLCriterion(input, target) * dK/dinput 

は、そのためだけKのWRTの微分に損失関数の入力を計算する必要がある入力、に対して、あなたの損失関数の導関数を返すupdateGradInputを実装したいあなたはしませんでしたKを計算する公式を与えて)、それを前の行に差し込みます。新しい損失関数はClassNLLCriterionに依存しているため、この損失関数のupdateGradInputupdateOutputを使用して計算することができます。

+0

基本的に私はカスタム基準を書く必要はありません。 'loss = ClassNLLCriterion:forward()* K'そして次に ' grad = ClassNLLCriterion:backward()* K + loss *(dK/dinput) ' これは正しいですか? – braindead

+0

うんこれも可能です – fonfonx

+0

素晴らしいです。ありがとう! Kが単なる定数(ネットワークパラメータや入力や出力に依存しない)であれば、あなたの答えはどのように変化しますか? – braindead

関連する問題