web-dev-qa-db-fra.com

Calcul de l'entropie croisée dans TensorFlow

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.

8
David Kaftan

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 sur logits en interne pour plus d'efficacité. N'appelez pas cette op avec la sortie de softmax, car cela produira des résultats incorrects.

logits et labels doivent avoir la même forme _[batch_size, num_classes]_ et le même dtype (soit _float16_, _float32_, soit _float64_).

13
Don Reba

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().

16
Franck Dernoncourt