CaffeのコードSigmoidCrossEntropyLoss layerとdocsを探していましたが、ちょっと混乱しています。ドキュメントはロストロストとしてロスト関数を列挙します(私はここでそれを複製しますが、ラテックスなしではこの式は読みにくいでしょう。ドキュメントリンクをチェックしてください)。Caffe SigmoidCrossEntropyLossレイヤーロス機能
しかし、コード自体(Forward_cpu(...)
)は、これが既に入力に印加されたシグモイド関数を占めているため、異なる式
Dtype loss = 0;
for (int i = 0; i < count; ++i) {
loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) -
log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0)));
}
top[0]->mutable_cpu_data()[0] = loss/num;
がそれであることを示して?
しかし、それでも、(input_data[i] >= 0)
スニペットも私を混乱させます。それらは、Sigmoid関数によって押しつぶされた予測であるはずのドキュメントの損失式からのp_hatの代わりにあるように見えます。では、バイナリのしきい値をとっているのはなぜですか?この損失が[0,1]の出力を予測するため、さらに混乱します。(input_data[i] >= 0)
は、それが100%確実でない限り1
になります。
誰かが私にこれを説明できますか?
が
一つは、(すなわち、[0,1]、むしろ{0,1}より)ソフトグランドトゥルースラベルを使用していたのであれば何も変更されなければなりませんか? – marcman
グラウンドトゥルースラベルの合計が1に等しい場合、このレイヤーに変更はありません。それ以外の場合は、ネットワークの各出力にクロスエントロピーを適用する変更を加える必要があります。 @marcman – Dale
私はそれがどういう場合であるのか理解していると思いますが、実際には、各ラベルを正規化したときにNaNの損失が発生しましたが、学習率の問題である可能性があります – marcman