in

Función de pérdida personalizada en Tensorflow 2.0

Función de pérdida personalizada en Tensorflow 2.0

Implementación de Pérdida de alto y bajo nivel.

Sunny Guha

6 de enero de 2020·3 min de lectura

El primer problema con el que me encontré cuando estaba aprendiendo a escribir mis propias capas en Tensorflow (TF) fue cómo escribir una función de pérdida. TF contiene casi todas las funciones de pérdida que necesitará, pero a veces eso no es suficiente. Al implementar el aprendizaje por refuerzo profundo o construir sus propios modelos, es posible que deba escribir sus funciones de pérdida. Esto es exactamente lo que esta publicación de blog pretende dilucidar. Escribiremos una función de pérdida de dos formas diferentes:

  1. Para el modelo tf.keras (nivel alto)
  2. Para modelos TF personalizados (nivel bajo)

Para ambos casos, wilConstruyo una red neuronal simple para aprender cuadrados de números. La red tomará una entrada y tendrá una salida. La red de ninguna manera es exitosa o completa. Es muy rudimentario y solo pretende demostrar las diferentes implementaciones de la función de pérdida.

1. pérdida personalizada de tf.keras (nivel alto)

Veamos una función de pérdida de alto nivel. Suponemos que ya hemos construido un modelo usando tf.keras. Se puede implementar una función de pérdida personalizada para el modelo de la siguiente manera:

Lo primero es lo primero, una función de pérdida personalizada SIEMPRE requiere dos argumentos. El primero es el valor real (y_actual) y el segundo es el valor predicho a través del modelo (y_model). Es importante señalar que ambos son Tensores TF y no Arreglos numerosos. Dentro de la función, puede calcular la pérdida como desee, con la excepción de que el valor de retorno debe ser un escalar TF.

En el ejemplo anterior, he calculado la pérdida de error al cuadrado utilizando tensorflow.keras.backend.square (). Sin embargo, no es necesario utilizar el backend de Keras, y cualquier operación de tensor válida funcionará bien.

Una vez que se calcula la función de pérdida, debemos pasarla en la llamada de compilación del modelo.

model.compile(loss=custom_loss,optimizer=optimizer)

El código completo se puede encontrar aquí: enlace

2. Pérdida de TF personalizada (nivel bajo)

En la parte anterior, analizamos un modelo de tf.keras. ¿Qué pasaría si quisiéramos escribir una red desde cero en TF, cómo implementaríamos la función de pérdida en este caso? Esta será una implementación de bajo nivel del modelo. Escribamos de nuevo el mismo modelo. La implementación completa se da a continuación,

¡Ufff! eso es mucho código. Analicemos la información.

__en eso__(): El constructor construye las capas del modelo (sin devolver un tf.keras.model.

correr(): Ejecuta el modelo para una entrada determinada pasando la entrada manualmente a través de capas y devuelve la salida de la capa final.

get_loss (): calcula la pérdida y la devuelve como un valor de TF Tensor

Hasta ahora parecía bastante fácil implementar la pérdida ya que estábamos tratando directamente con modelos, pero ahora necesitamos realizar el aprendizaje por autodiferenciación. Esto se implementa en TF 2.0 usando tf.GradientTape (). La función get_grad () calcula el gradiente wrt a las variables de las capas. Es importante tener en cuenta que todas las variables y argumentos son tensores TF.

network_learn (): Aplicamos el paso de descenso de gradiente en esta función usando los gradientes obtenidos de la función get_grad ().

Con todo escrito, podemos implementar el ciclo de entrenamiento de la siguiente manera,

x=[1,2,3,4,5,6,7,8,9,10]
x=np.asarray(x,dtype=np.float32).reshape((10,1))
y=[1,4,9,16,25,36,49,64,81,100]
y=np.asarray(y,dtype=np.float32).reshape((10,1))
model=model()
for i in range(100):
model.network_learn(x,y)

El código completo se puede encontrar aquí: enlace

Conclusión

En esta publicación, hemos visto la implantación tanto de alto nivel como de bajo nivel de una función de pérdida personalizada en TensorFlow 2.0. Saber cómo implementar una función de pérdida personalizada es indispensable en Reinforcement Learning o Deep Learning avanzado y espero que este pequeño post te haya facilitado la implementación de tu propia función de pérdida. Para obtener más detalles sobre las funciones de pérdida personalizadas, remitimos al lector a la documentación de TensorFlow.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tecla eliminar

Cómo desinstalar Groove Music de Windows 10 y qué sucede si lo elimino

La empresa de software de construcción empresarial CMIC se implementa 10 veces más rápido en oracleCloud