Logits simplemente significa que la función opera en la salida sin escala de capas anteriores y que la escala relativa para comprender las unidades es lineal. Significa, en particular, que la suma de las entradas puede no ser igual a 1, que los valores no son probabilidades (puede tener una entrada de 5).
tf.nn.softmax
produce solo el resultado de aplicar la función softmax a un tensor de entrada. El softmax "aplasta" las entradas para que sum(input) = 1
: sea una forma de normalización. La forma de salida de un softmax es la misma que la entrada: simplemente normaliza los valores. Las salidas de softmax pueden interpretarse como probabilidades.
a = tf.constant(np.array([[.1, .3, .5, .9]]))
print s.run(tf.nn.softmax(a))
[[ 0.16838508 0.205666 0.25120102 0.37474789]]
Por el contrario, tf.nn.softmax_cross_entropy_with_logits
calcula la entropía cruzada del resultado después de aplicar la función softmax (pero lo hace todo de una manera matemáticamente más cuidadosa). Es similar al resultado de:
sm = tf.nn.softmax(x)
ce = cross_entropy(sm)
La entropía cruzada es una métrica de resumen: suma a través de los elementos. La salida de tf.nn.softmax_cross_entropy_with_logits
un [2,5]
tensor de forma es de forma [2,1]
(la primera dimensión se trata como el lote).
Si desea hacer una optimización para minimizar la entropía cruzada Y está haciendo softmaxing después de su última capa, debe usarla en tf.nn.softmax_cross_entropy_with_logits
lugar de hacerlo usted mismo, porque cubre casos de esquina numéricamente inestables de la manera matemáticamente correcta. De lo contrario, terminarás hackeando agregando pequeños épsilons aquí y allá.
Editado el 07/02/2016:
si tiene etiquetas de una sola clase, donde un objeto solo puede pertenecer a una clase, ahora puede considerar usarlo tf.nn.sparse_softmax_cross_entropy_with_logits
para no tener que convertir sus etiquetas en una matriz densa de un solo hot. Esta función se agregó después de la versión 0.6.0.
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(tf.nn.softmax(tf.add(tf.matmul(x,W),b)),y) cost=tf.reduce_mean(cross_entropy)
. Pero cuando uso otra forma,pred=tf.nn.softmax(tf.add(tf.matmul(x,W),b)) cost =tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))
el resultado es estable y mejor.tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W, b))
en tu caso.b
debe estar fuera del soporte,tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W), b)
Version corta:
Suponga que tiene dos tensores, donde
y_hat
contiene puntajes calculados para cada clase (por ejemplo, de y = W * x + b) yy_true
contiene etiquetas verdaderas codificadas en caliente.Si interpreta los puntajes
y_hat
como probabilidades de registro no normalizadas, entonces son logits .Además, la pérdida total de entropía cruzada se calculó de esta manera:
es esencialmente equivalente a la pérdida total de entropía cruzada calculada con la función
softmax_cross_entropy_with_logits()
:Versión larga:
En la capa de salida de su red neuronal, probablemente calculará una matriz que contiene los puntajes de clase para cada una de sus instancias de entrenamiento, como a partir de un cálculo
y_hat = W*x + b
. Para servir de ejemplo, a continuación he creado unay_hat
matriz de 2 x 3, donde las filas corresponden a las instancias de entrenamiento y las columnas corresponden a las clases. Así que aquí hay 2 instancias de entrenamiento y 3 clases.Tenga en cuenta que los valores no están normalizados (es decir, las filas no suman 1). Para normalizarlos, podemos aplicar la función softmax, que interpreta la entrada como probabilidades de registro no normalizadas (también conocidas como logits ) y genera probabilidades lineales normalizadas.
Es importante comprender completamente lo que dice la salida softmax. A continuación, he mostrado una tabla que representa más claramente el resultado anterior. Se puede ver que, por ejemplo, la probabilidad de que la instancia de entrenamiento 1 sea "Clase 2" es 0.619. Las probabilidades de clase para cada instancia de entrenamiento están normalizadas, por lo que la suma de cada fila es 1.0.
Entonces, ahora tenemos probabilidades de clase para cada instancia de entrenamiento, donde podemos tomar el argumento argmax () de cada fila para generar una clasificación final. Desde arriba, podemos generar que la instancia de entrenamiento 1 pertenece a "Clase 2" y la instancia de entrenamiento 2 pertenece a "Clase 1".
¿Son correctas estas clasificaciones? Necesitamos medir contra las verdaderas etiquetas del conjunto de entrenamiento. Necesitará una
y_true
matriz codificada en caliente , donde nuevamente las filas son instancias de entrenamiento y las columnas son clases. A continuación, he creado un ejemplo dey_true
una matriz activa donde la etiqueta verdadera para la instancia de entrenamiento 1 es "Clase 2" y la etiqueta verdadera para la instancia de entrenamiento 2 es "Clase 3".¿La distribución de probabilidad es
y_hat_softmax
cercana a la distribución de probabilidad eny_true
? Podemos usar la pérdida de entropía cruzada para medir el error.Podemos calcular la pérdida de entropía cruzada en base a filas y ver los resultados. A continuación podemos ver que la instancia de entrenamiento 1 tiene una pérdida de 0.479, mientras que la instancia de entrenamiento 2 tiene una pérdida mayor de 1.200. Este resultado tiene sentido porque en nuestro ejemplo anterior,
y_hat_softmax
mostró que la mayor probabilidad de la instancia de entrenamiento 1 era para "Clase 2", que coincide con la instancia de entrenamiento 1 eny_true
; sin embargo, la predicción para la instancia de entrenamiento 2 mostró una mayor probabilidad de "Clase 1", que no coincide con la verdadera clase "Clase 3".Lo que realmente queremos es la pérdida total en todas las instancias de entrenamiento. Entonces podemos calcular:
Usando softmax_cross_entropy_with_logits ()
En cambio, podemos calcular la pérdida total de entropía cruzada utilizando la
tf.nn.softmax_cross_entropy_with_logits()
función, como se muestra a continuación.Tenga en cuenta que
total_loss_1
ytotal_loss_2
producir resultados esencialmente equivalentes con algunas pequeñas diferencias en los dígitos finales. Sin embargo, también podría usar el segundo enfoque: toma una línea de código menos y acumula menos errores numéricos porque el softmax se realiza dentro de ustedsoftmax_cross_entropy_with_logits()
.fuente
M = tf.random.uniform([100, 10], minval=-1.0, maxval=1.0); labels = tf.one_hot(tf.random.uniform([100], minval=0, maxval=10 , dtype='int32'), 10); tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=M) - tf.reduce_sum(-tf.nn.log_softmax(M)*tf.one_hot(labels, 10), -1)
devuelve casi cero en todas partestf.nn.softmax
calcula la propagación hacia adelante a través de una capa softmax. Lo usa durante la evaluación del modelo cuando calcula las probabilidades que genera el modelo.tf.nn.softmax_cross_entropy_with_logits
calcula el costo de una capa softmax. Solo se usa durante el entrenamiento .Los logits son las probabilidades de registro no normalizadas que salen del modelo (los valores que salen antes de que se les aplique la normalización softmax).
fuente
tf.nn.softmax_cross_entropy_with_logits
es evaluar cuánto se desvía el modelo de las etiquetas doradas, no proporcionar una salida normalizada.tf.nn.sparse_softmax_cross_entropy_with_logits
. Para obtener probabilidades usetf.nn.softmax
.Las respuestas anteriores tienen suficiente descripción para la pregunta formulada.
Además de eso, Tensorflow ha optimizado la operación de aplicar la función de activación y luego calcular el costo utilizando su propia activación seguida de las funciones de costo. Por lo tanto, es una buena práctica usar:
tf.nn.softmax_cross_entropy()
overtf.nn.softmax(); tf.nn.cross_entropy()
Puede encontrar una diferencia notable entre ellos en un modelo de uso intensivo de recursos.
fuente
tf.nn.softmax
seguido detf.losses.softmax_cross_entropy
?Lo que pasa
softmax
es logit, esto es lo que J. Hinton repite en los videos de curso todo el tiempo.fuente
2.0 Tensorflow respuesta Compatible : Las explicaciones de
dga
ystackoverflowuser2010
son muy detallados sobre logits y las funciones relacionadas.Todas esas funciones, cuando se usan
Tensorflow 1.x
, funcionarán bien, pero si migra su código de1.x (1.14, 1.15, etc)
a2.x (2.0, 2.1, etc..)
, el uso de esas funciones dará como resultado un error.Por lo tanto, especificando las llamadas compatibles 2.0 para todas las funciones, discutimos anteriormente, si migramos desde
1.x to 2.x
, para el beneficio de la comunidad.Funciones en 1.x :
tf.nn.softmax
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits
Funciones respectivas cuando se migra de 1.xa 2.x :
tf.compat.v2.nn.softmax
tf.compat.v2.nn.softmax_cross_entropy_with_logits
tf.compat.v2.nn.sparse_softmax_cross_entropy_with_logits
Para obtener más información sobre la migración de 1.xa 2.x, consulte esta Guía de migración .
fuente
Una cosa más que definitivamente me gustaría destacar como logit es solo una salida sin formato, generalmente la salida de la última capa. Esto también puede ser un valor negativo. Si lo usamos como para la evaluación de "entropía cruzada" como se menciona a continuación:
entonces no funcionará. Como log de -ve no está definido. Entonces, utilizando la activación de o softmax, se superará este problema.
Este es mi entendimiento, corrígeme si estoy equivocado.
fuente