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 codificarse en un solo uso cuando se usan 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 entonces, ¿por qué necesitamos la función adicional?
¿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 un solo uso?
neural-network
tensorflow
softmax
cross-entropy
daniel451
fuente
fuente
Respuestas:
Tener dos funciones diferentes es conveniente , ya que producen el mismo resultado.
La diferencia es simple:
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 rango[0, num_classes-1]
.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 activa de las etiquetas utilizadas ensparse_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 pérdida0
en esta etiqueta.fuente
Solo me gustaría agregar 2 cosas a la respuesta aceptada que también puede encontrar en la documentación de TF.
Primero:
Segundo:
fuente
Ambas funciones calculan los mismos resultados y sparse_softmax_cross_entropy_with_logits calcula la entropía cruzada directamente en las etiquetas dispersas en lugar de convertirlas con codificación one-hot .
Puede verificar esto ejecutando el siguiente programa:
Aquí creo un
logits
vector aleatorio de longituddims
y genero etiquetas codificadas one-hot (donde el elemento enpos
es 1 y otros son 0).Después de eso, calculo softmax y sparse softmax y comparo su salida. Intente volver a ejecutarlo varias veces para asegurarse de que siempre produzca el mismo resultado
fuente