web-dev-qa-db-fra.com

Quelle est la différence entre sparse_softmax_cross_entropy_with_logits et softmax_cross_entropy_with_logits?

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?

95
daniel451

Avoir deux fonctions différentes est un commodité, car elles produisent le même résultat.

La différence est simple:

  • Pour 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].
  • Pour 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.

161
Olivier Moindrot

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

24
Drag0

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.

19
Salvador Dali