web-dev-qa-db-ja.com

TensorFlowでのクロスエントロピーの計算

テンソルフローのクロスエントロピーの計算に苦労しています。特に、私は関数を使用しています:

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

ゼロ以外のクロスエントロピーがあるはずです。テンソルフローを誤って使用していると予想しています。助けてくれてありがとう。

8
David Kaftan

彼らが言うように、「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を呼び出さないでください。

logitslabelsは、同じ形状_[batch_size, num_classes]_と同じdtype(_float16_、_float32_、または_float64_)でなければなりません。

13
Don Reba

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()を使用することをお勧めします。

16