テンソルフローのクロスエントロピーの計算に苦労しています。特に、私は関数を使用しています:
tf.nn.softmax_cross_entropy_with_logits()
一見シンプルなコードを使用して、ゼロを返すようにすることができます
import tensorflow as tf
import numpy as np
sess = tf.InteractiveSession()
a = tf.placeholder(tf.float32, shape =[None, 1])
b = tf.placeholder(tf.float32, shape = [None, 1])
sess.run(tf.global_variables_initializer())
c = tf.nn.softmax_cross_entropy_with_logits(
logits=b, labels=a
).eval(feed_dict={b:np.array([[0.45]]), a:np.array([[0.2]])})
print c
戻り値
0
クロスエントロピーの私の理解は次のとおりです。
H(p,q) = p(x)*log(q(x))
ここでp(x)はイベントxの真の確率であり、q(x)はイベントxの予測確率です。
ここで、p(x)およびq(x)=
0<p(x)<1 AND 0<q(x)<1
ゼロ以外のクロスエントロピーがあるはずです。テンソルフローを誤って使用していると予想しています。助けてくれてありがとう。
彼らが言うように、「softmax」なしで「softmax_cross_entropy_with_logits」を綴ることはできません。 _[0.45]
_のSoftmaxは_[1]
_であり、log(1)
は_0
_です。
クラスが相互に排他的である個別の分類タスク(各エントリが正確に1つのクラスにある)の確率誤差を測定します。たとえば、各CIFAR-10画像には1つのラベルのみがラベル付けされています。画像には犬またはトラックを使用できますが、両方は使用できません。
注:クラスは相互に排他的ですが、確率はそうである必要はありません。必要なのは、
labels
の各行が有効な確率分布であることだけです。そうでない場合、勾配の計算は不正確になります。排他的な
labels
(一度に1つのクラスのみが真である)を使用する場合は、_sparse_softmax_cross_entropy_with_logits
_を参照してください。警告:この操作は、効率のために
softmax
に対してlogits
を内部で実行するため、スケールなしのロジットを期待します。誤った結果を生成するため、softmax
の出力でこのopを呼び出さないでください。
logits
とlabels
は、同じ形状_[batch_size, num_classes]
_と同じdtype(_float16
_、_float32
_、または_float64
_)でなければなりません。
Donの回答(+1)に加えて、TensorFlowでクロスエントロピーを計算する式を提供するため、 mrryによって書かれたこの回答 に興味があるかもしれません。
別の書き方:
_xent = tf.nn.softmax_cross_entropy_with_logits(logits, labels)
_...だろう:
_softmax = tf.nn.softmax(logits) xent = -tf.reduce_sum(labels * tf.log(softmax), 1)
_ただし、この代替方法は、(i)数値的に安定性が劣る(softmaxがはるかに大きな値を計算する可能性があるため)および(ii)効率が低下する(backpropで冗長な計算が発生するため)。実際の使用には、
tf.nn.softmax_cross_entropy_with_logits()
を使用することをお勧めします。