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?
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:Además, la llamada de
tf.cast
y el módulotf.experimental.numpy
no son necesarios en este caso, y la llamada detf.math.multiply
se puede simplificar a solo-
.Esta función de pérdida actualizada debería dar los resultados esperados sin devolver NaN.