の中にテンソルフロー API ドキュメントと呼ばれるキーワードを使用しますlogits
。これは何でしょうか? 多くのメソッドは次のように記述されます:
tf.nn.softmax(logits, name=None)
logits
が単なる汎用入力である場合Tensor
、なぜ という名前が付けられるのでしょうかlogits
?
次に、次の 2 つの方法の違いは何でしょうか?
tf.nn.softmax(logits, name=None)
tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)
何がそうなのかは分かっていますtf.nn.softmax
が、他のことは分かりません。例があると本当に助かります。
ベストアンサー1
softmax+logits は、関数が以前のレイヤーのスケールされていない出力に対して動作し、単位を理解するための相対スケールが線形であることを意味します。特に、入力の合計が 1 にならない場合があり、値が確率ではないことを意味します(入力が 5 になる場合があります)。内部的には、最初にスケールされていない出力に softmax を適用し、次にそれらの値のクロス エントロピーと、ラベルによって定義された「あるべき」値を計算し、次にそれらの値をクロス エントロピーとして計算します。
tf.nn.softmax
を適用した結果を生成しますソフトマックス関数を入力テンソルに渡します。ソフトマックスは入力を となるように「圧縮」しsum(input) = 1
、入力を対数確率 (ロジット) として解釈してマッピングを行い、その後 0 から 1 の間の生の確率に戻します。ソフトマックスの出力の形状は入力と同じです。
a = tf.constant(np.array([[.1, .3, .5, .9]]))
print s.run(tf.nn.softmax(a))
[[ 0.16838508 0.205666 0.25120102 0.37474789]]
見るこの答えDNN でソフトマックスが広く使用されている理由について詳しくは、こちらをご覧ください。
tf.nn.softmax_cross_entropy_with_logits
ソフトマックス関数を適用した後のクロスエントロピー損失の計算とソフトマックスステップを組み合わせますが、より数学的に慎重な方法ですべてを実行します。次の結果に似ています。
sm = tf.nn.softmax(x)
ce = cross_entropy(sm)
クロス エントロピーは要約メトリックです。要素全体を合計します。tf.nn.softmax_cross_entropy_with_logits
シェイプ[2,5]
テンソルの出力はシェイプです[2,1]
(最初の次元はバッチとして扱われます)。
クロスエントロピーを最小化するために最適化を行い、かつ最後のレイヤーの後でソフトマックスを行う場合は、tf.nn.softmax_cross_entropy_with_logits
自分で行うのではなく を使用する必要があります。これは、数値的に不安定なコーナーケースを数学的に正しい方法でカバーするためです。そうしないと、あちこちに小さなイプシロンを追加してハッキングすることになります。
2016-02-07 編集:オブジェクトが 1 つのクラスにしか属せない単一クラスのラベルがある場合は、tf.nn.sparse_softmax_cross_entropy_with_logits
ラベルを密な one-hot 配列に変換する必要がないように、 の使用を検討してください。 この関数は、リリース 0.6.0 以降に追加されました。