es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La función de pérdida “Sparse Categorical CrossEntropy” está causando una pérdida de tipo NAN.

Entonces, he estado tratando de implementar algunas pérdidas personalizadas y pensé en comenzar implementando la pérdida SCE, sin utilizar el objeto TF incorporado. Aquí está la función que escribí para ello.

def custom_loss(y_true, y_pred):
    print(y_true, y_pred)
    return tf.cast(tf.math.multiply(tf.experimental.numpy.log2(y_pred[y_true[0]]), -1), dtype=tf.float32)

y_pred es el conjunto de probabilidades y y_true es el índice del correcto. Según todo lo que he leído, esta configuración debería funcionar, pero devuelve una pérdida NAN.

Verifiqué si hay un problema con el bucle de entrenamiento, pero funciona perfectamente con las pérdidas incorporadas.

¿Podría alguien decirme cuál es el problema con este código?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con esta función de pérdida personalizada es que tomar el np.log2 de una probabilidad de predicción de 0 resultará en infinito negativo, lo que a su vez dará como resultado una pérdida final como NaN (no es un número). Una forma de mitigar este problema es agregar un valor de épsilon pequeño a las probabilidades de predicción antes de tomar el logaritmo, de la siguiente manera:

    def custom_loss(y_true, y_pred):
        epsilon = 1e-7
        y_pred = tf.clip_by_value(y_pred, epsilon, 1 - epsilon) # Asegurar que la predicción esté limitada lejos de 0 y 1
        return -tf.math.log(y_pred[0, y_true[0]])
    

    Además, la llamada de tf.cast y el módulo tf.experimental.numpy no son necesarios en este caso, y la llamada de tf.math.multiply se puede simplificar a solo -.

    Esta función de pérdida actualizada debería dar los resultados esperados sin devolver NaN.

Comments are closed.