Je suis récemment tombé sur tf.nn.sparse_softmax_cross_entropy_with_logits et je ne peux pas comprendre en quoi la différence est comparée à tf.nn.softmax_cross_entropy_with_logits .
Est-ce que la seule différence entre les vecteurs d'apprentissage y
doit être codé à chaud lors de l'utilisation de sparse_softmax_cross_entropy_with_logits
?
En lisant l'API, je n'ai pas pu trouver d'autre différence que softmax_cross_entropy_with_logits
. Mais pourquoi avons-nous besoin de la fonction supplémentaire alors?
softmax_cross_entropy_with_logits
ne devrait-il pas produire les mêmes résultats que sparse_softmax_cross_entropy_with_logits
s'il est alimenté avec des données/vecteurs d'apprentissage codés à chaud?
Avoir deux fonctions différentes est un commodité, car elles produisent le même résultat.
La différence est simple:
sparse_softmax_cross_entropy_with_logits
, les étiquettes doivent avoir la forme [batch_size] et le type int32 ou int64. Chaque étiquette est un entier dans la plage [0, num_classes-1]
.softmax_cross_entropy_with_logits
, les étiquettes doivent avoir la forme [batch_size, num_classes] et dtype float32 ou float64.Les étiquettes utilisées dans softmax_cross_entropy_with_logits
sont les ne version à chaud des étiquettes utilisées dans sparse_softmax_cross_entropy_with_logits
.
Une autre différence minime est que, avec sparse_softmax_cross_entropy_with_logits
, vous pouvez attribuer -1 à une étiquette afin d’avoir une perte 0
sur cette étiquette.
Je voudrais juste ajouter 2 choses à la réponse acceptée que vous pouvez également trouver dans la documentation de TF.
Première:
tf.nn.softmax_cross_entropy_with_logits
REMARQUE: Bien que les classes s'excluent mutuellement, leurs probabilités ne doivent pas nécessairement l'être. Tout ce qui est requis est que chaque ligne d'étiquettes constitue une distribution de probabilité valide. S'ils ne le sont pas, le calcul du gradient sera incorrect.
Seconde:
tf.nn.sparse_softmax_cross_entropy_with_logits
REMARQUE: pour cette opération, la probabilité qu'une étiquette soit donnée est considérée comme exclusive. Autrement dit, les classes logicielles ne sont pas autorisées et le vecteur d'étiquettes doit fournir un seul index spécifique pour la classe vraie pour chaque ligne de logits (chaque entrée de minibatch).
Les deux fonctions calculent les mêmes résultats et sparse_softmax_cross_entropy_with_logits calcule l'entropie croisée directement sur les étiquettes fragmentées au lieu de les convertir avec encodage à chaud .
Vous pouvez le vérifier en exécutant le programme suivant:
import tensorflow as tf
from random import randint
dims = 8
pos = randint(0, dims - 1)
logits = tf.random_uniform([dims], maxval=3, dtype=tf.float32)
labels = tf.one_hot(pos, dims)
res1 = tf.nn.softmax_cross_entropy_with_logits( logits=logits, labels=labels)
res2 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=tf.constant(pos))
with tf.Session() as sess:
a, b = sess.run([res1, res2])
print a, b
print a == b
Ici, je crée un vecteur logits
aléatoire de longueur dims
et génère des étiquettes codées à chaud (où élément dans pos
est 1 et les autres sont 0).
Après cela, je calcule softmax et softmax clairsemé et compare leurs résultats. Essayez de le réexécuter plusieurs fois pour vous assurer qu'il produit toujours le même résultat.