softmax_cross_entropy losses cross neural-network tensorflow softmax cross-entropy

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.