103 votes

Ce qui ' 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 n'arrive pas à comprendre quelle est la différence par rapport à tf.nn.softmax_cross_entropy_with_logits.

C'est la seule différence que la formation des vecteurs y être un chaud codé lors de l'utilisation d' sparse_softmax_cross_entropy_with_logits?

La lecture de l'API, j'ai été incapable de trouver une autre différence par rapport à l' softmax_cross_entropy_with_logits. Mais pourquoi avons-nous besoin de la fonction supplémentaire alors?

Ne devrait pas softmax_cross_entropy_with_logits produire les mêmes résultats que l' sparse_softmax_cross_entropy_with_logits, si elle est fournie avec un chaud codé les données sur la formation/les vecteurs?

167voto

Olivier Moindrot Points 17630

Avoir deux fonctions différentes est une commodité, car ils 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 la dtype int32 ou int64. Chaque étiquette est un entier dans la plage de [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 en softmax_cross_entropy_with_logits sont l' un hot version d'étiquettes utilisées en sparse_softmax_cross_entropy_with_logits.

Une autre petite différence est que, avec sparse_softmax_cross_entropy_with_logits, vous pouvez donner à -1 comme une étiquette à avoir des pertes 0 sur la présente étiquette.

24voto

Drag0 Points 466

Je voudrais juste ajouter 2 choses à accepté de répondre à cela, vous pouvez également trouver dans la TF de la documentation.

D'abord:

tf.nn.softmax_cross_entropy_with_logits

REMARQUE: les catégories sont mutuellement exclusives, leurs probabilités pas besoin d'être. Tout ce qui est nécessaire, c'est que chaque ligne d'étiquettes est un valide distribution de probabilité. Si ils ne le sont pas, le calcul de le dégradé sera incorrect.

Deuxième:

tf.nn.sparse_softmax_cross_entropy_with_logits

REMARQUE: Pour cette opération, la probabilité d'une étiquette donnée est considéré comme exclusif. C'est, doux classes ne sont pas autorisés, et l' étiquettes de vecteur doit fournir qu'un seul indice pour la vraie classe pour chaque ligne de logits (chaque minibatch entrée).

21voto

Salvador Dali Points 11667

Les deux fonctions calcule les mêmes résultats et sparse_softmax_cross_entropy_with_logits calcule la croix entropie directement sur les rares étiquettes au lieu de les convertir avec "one-hot" de l'encodage.

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, j'ai créer un random logits vecteur de longueur dims et de générer des "one-hot" codé étiquettes (où l'élément en pos est de 1 et les autres sont à 0).

Après que je calcule softmax et clairsemée softmax et de comparer leur sortie. Essayez de réexécuter à quelques reprises pour s'assurer qu'il produit toujours la même sortie

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X