J'ai du mal à calculer l'entropie croisée en tensorflow. En particulier, j'utilise la fonction:
tf.nn.softmax_cross_entropy_with_logits()
En utilisant ce qui semble être du code simple, je ne peux que le renvoyer à zéro
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
retour
0
Ma compréhension de l'entropie croisée est la suivante:
H(p,q) = p(x)*log(q(x))
Où p(x) est la vraie probabilité de l'événement x et q(x) est la probabilité prédite de l'événement x.
Là, si vous entrez deux nombres pour p(x) et q(x) sont utilisés de telle sorte que
0<p(x)<1 AND 0<q(x)<1
il devrait y avoir une entropie croisée non nulle. Je m'attends à ce que j'utilise incorrectement tensorflow. Merci d'avance pour votre aide.
Comme on dit, vous ne pouvez pas épeler "softmax_cross_entropy_with_logits" sans "softmax". Softmax de _[0.45]
_ est _[1]
_ et log(1)
est _0
_.
Mesure l'erreur de probabilité dans les tâches de classification discrètes dans lesquelles les classes s'excluent mutuellement (chaque entrée est dans exactement une classe). Par exemple, chaque image CIFAR-10 est étiquetée avec une et une seule étiquette: une image peut être un chien ou un camion, mais pas les deux.
REMARQUE: Bien que les classes s'excluent mutuellement, leurs probabilités n'ont pas besoin de l'être. Il suffit que chaque ligne de
labels
soit une distribution de probabilité valide. Si ce n'est pas le cas, le calcul du gradient sera incorrect.Si vous utilisez un
labels
exclusif (dans lequel une et une seule classe est vraie à la fois), consultez _sparse_softmax_cross_entropy_with_logits
_.AVERTISSEMENT: Cette opération attend des logits non mis à l'échelle, car elle effectue un
softmax
surlogits
en interne pour plus d'efficacité. N'appelez pas cette op avec la sortie desoftmax
, car cela produira des résultats incorrects.
logits
etlabels
doivent avoir la même forme _[batch_size, num_classes]
_ et le même dtype (soit _float16
_, _float32
_, soit _float64
_).
En plus de la réponse de Don (+1), cette réponse écrite par mrry peut vous intéresser, car elle donne la formule pour calculer l'entropie croisée dans TensorFlow:
Une manière alternative d'écrire:
xent = tf.nn.softmax_cross_entropy_with_logits(logits, labels)
...serait:
softmax = tf.nn.softmax(logits) xent = -tf.reduce_sum(labels * tf.log(softmax), 1)
Cependant, cette alternative serait (i) moins stable numériquement (puisque le softmax peut calculer des valeurs beaucoup plus grandes) et (ii) moins efficace (car certains calculs redondants se produiraient dans le backprop). Pour des utilisations réelles, nous vous recommandons d'utiliser
tf.nn.softmax_cross_entropy_with_logits()
.