neural network - losses - ¿Cuál es la diferencia entre sparse_softmax_cross_entropy_with_logits y softmax_cross_entropy_with_logits?
tensor flow softmax (3)
Ambas funciones calculan los mismos resultados y tf.nn.sparse_softmax_cross_entropy_with_logits calcula la entropía cruzada directamente en las etiquetas dispersas en lugar de convertirlas con una codificación de uno en caliente .
Puede verificar esto ejecutando el siguiente programa:
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
Aquí creo un vector
logits
aleatorio de
logits
de longitud y genero etiquetas codificadas en un solo punto (donde el elemento en
pos
es 1 y otros son 0).
Después de eso calculo softmax y softmax disperso y comparo su salida. Intente volver a ejecutarlo varias veces para asegurarse de que siempre produce el mismo resultado
Recientemente me encontré con tf.nn.sparse_softmax_cross_entropy_with_logits y no puedo entender cuál es la diferencia en comparación con tf.nn.softmax_cross_entropy_with_logits .
¿Es la única diferencia que los vectores de entrenamiento
y
tienen que estar
codificados en caliente
cuando se usa
sparse_softmax_cross_entropy_with_logits
?
Al leer la API, no pude encontrar ninguna otra diferencia en comparación con
softmax_cross_entropy_with_logits
.
Pero, ¿por qué necesitamos la función extra entonces?
¿No debería
softmax_cross_entropy_with_logits
producir los mismos resultados que
sparse_softmax_cross_entropy_with_logits
, si se suministra con datos / vectores de entrenamiento codificados en caliente?
Solo me gustaría agregar 2 cosas a la respuesta aceptada que también puede encontrar en la documentación de TF.
Primero:
tf.nn.softmax_cross_entropy_with_logits
NOTA: Si bien las clases son mutuamente excluyentes, sus probabilidades no necesitan serlo. Todo lo que se requiere es que cada fila de etiquetas sea una distribución de probabilidad válida. Si no lo son, el cálculo del gradiente será incorrecto.
Segundo:
tf.nn.sparse_softmax_cross_entropy_with_logits
NOTA: Para esta operación, la probabilidad de una etiqueta dada se considera exclusiva. Es decir, no se permiten clases suaves, y el vector de etiquetas debe proporcionar un único índice específico para la clase verdadera para cada fila de logits (cada entrada de minibatch).
Tener dos funciones diferentes es una conveniencia , ya que producen el mismo resultado.
La diferencia es simple:
-
Para
sparse_softmax_cross_entropy_with_logits
, las etiquetas deben tener la forma [batch_size] y el dtype int32 o int64. Cada etiqueta es un int en el rango[0, num_classes-1]
. -
Para
softmax_cross_entropy_with_logits
, las etiquetas deben tener la forma [batch_size, num_classes] y dtype float32 o float64.
Las etiquetas utilizadas en
softmax_cross_entropy_with_logits
son la
única versión
sparse_softmax_cross_entropy_with_logits
de las etiquetas utilizadas en
sparse_softmax_cross_entropy_with_logits
.
Otra pequeña diferencia es que con
sparse_softmax_cross_entropy_with_logits
, puede dar -1 como etiqueta para tener una pérdida
0
en esta etiqueta.