Tf.nn.sigmoid_cross_entropy_with_logits()関数の解析
Tf Nn Sigmoid_cross_entropy_with_logits Function Parsing
最近、以前に学習したtf.nn.sigmoid_cross_entropy_with_logits()関数に遭遇し、ここに記録します。
tf.nn.sigmoid_cross_entropy_with_logits()関数は、クロスエントロピーを計算するために使用されます。
tf.nn.sigmoid_cross_entropy_with_logits( _sentinel=None, labels=None, logits=None, name=None )
パラメータ:
- _sentinel:本質的に未使用のパラメーター、入力する必要はありません
- ラベル:ロジットと同じタイプ(フロート)と形状テンソルを持っています
- ロジット:データ型(type)はfloat32またはfloat64です
- 名前:操作の名前。入力することも入力しないこともできます
戻り値:
長さbatch_sizeの1次元テンソル
注:ラベルの各行がワンホットである場合、つまり1つの場所のみが1で、残りが0の場合、tf.sparse_softmax_cross_entropy_with_logits()を使用できます。
Tensorflowクロスエントロピー計算関数入力のロジットは、softmaxまたはsigmoidの出力ではなく、関数内でsigmoidまたはsoftmax操作を実行するため、softmaxまたはsigmoid関数の入力です。
パラメータlabels、logitsは、同じ形状[batch_size、num_classes]で、同じタイプ(float16、float32、float64)のいずれかである必要があります。
例1:
import tensorflow as tf labels = [[0.2,0.3,0.5], [0.1,0.6,0.3]] logits = [[2,0.5,1], [0.1,1,3]] logits_scaled = tf.nn.softmax(logits) result1 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits) result2 = -tf.reduce_sum(labels*tf.log(logits_scaled),1) result3 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits_scaled) with tf.Session() as sess: print(sess.run(result1)) print(sess.run(result2)) print(sess.run(result3))
> [1.4143689 1.6642545] [1.4143689 1.6642545] [1.1718578 1.1757141]
上記の例では、ラベルの各行は度数分布であり、ロジットはスケーリングされません(各行の合計は1になりません)。定義メソッドを使用してクロスエントロピーの結果2を計算し、tf.nn.softmax_cross_entropy_with_logits()を適用して同じ結果を取得しますが、スケーリングされたlogits_scaledはtf.nn.softmax_cross_entropy_with_logits()を失いますが、間違った結果を取得します。この操作の入力ロジットはスケーリングされていないことに注意してください。