Cómo escribir una función de pérdida personalizada en Tensorflow?


Soy nuevo en tensorflow. Quiero escribir mi propia función de pérdida personalizada. ¿Hay algún tutorial sobre esto? Por ejemplo, la pérdida de bisagra o un sum_of_square_loss(aunque esto ya está en tf)? ¿Puedo hacerlo directamente en python o tengo que escribir el código cpp?

 23
Author: Gu Wang, 2016-01-19

4 answers

Echa un vistazo a Añadiendo un nuevo Op

Puede que no sea exactamente lo que necesita, sin embargo, debería darle lo suficiente para comenzar.


Requisitos previos:


Si desea incorporar una operación que no está cubierta por la biblioteca existente, puede crear una Op personalizada.:

  • Registre el nuevo Op en un archivo C++. El Op de registro es independiente de la implementación, y describe la semántica de cómo el Op se invoca. Por ejemplo, define el nombre de Op y especifica sus entradas y salidas.
  • Implementar el Op en C++. Esta implementación se llama un "kernel", y puede haber varios núcleos para diferentes arquitecturas (por ejemplo, CPU, GPU) o tipos de entrada / salida.

  • Crea un wrapper de Python. Esta envoltura es la API pública para crear el Op. Se genera un wrapper predeterminado a partir del registro del Op, que se puede usar directamente o agregar.

  • Opcionalmente, escriba una función para calcular gradientes para el Op.

  • Opcionalmente, escriba una función que describa las formas de entrada y salida para el Op. Esto permite que la inferencia de formas funcione con su Op.

  • Prueba el Op, típicamente en Python. Si define degradados, puede verificarlos con el Python GradientChecker .

 3
Author: Guy Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-16 17:24:12

Necesitamos escribir la función de pérdida. Por ejemplo, podemos usar el error cuadrado medio básico como nuestra función de pérdida para y predicho y y_:

 loss_mse = 1/n(Sum((y-y_)^2))

Hay funciones básicas para los tensores como tf.add(x,y), tf.sub(x,y), tf.square(x), tf.reduce_sum(x), etc.

Entonces podemos definir nuestra función de pérdida en Tensorflow como:

cost = tf.reduce_mean(tf.square(tf.sub(y,y_)))

Nota: y e y_ son tensores.

Además, podemos definir cualquier otra función de pérdida si podemos escribir las ecuaciones. Para algunos operadores de formación (minimizadores), la función de pérdida debe satisfacer algunas condiciones (suave, diferenciable ...).

En una palabra, Tensorflow define arrays, constantes, variables en tensores, define cálculos usando funciones tf y usa session para ejecutar though graph. Podemos definir lo que queramos y ejecutarlo al final.

 38
Author: Q.Liu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-01 15:58:28

Además de la otra respuesta, puede escribir una función de pérdida en Python si se puede representar como una composición de funciones existentes.

Eche un vistazo, por ejemplo, a la implementación de sigmoid_cross_entropy_with_logits link, que se implementa mediante transformaciones básicas.

 12
Author: Rafał Józefowicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-19 13:11:06

Casi en todos los tutoriales de tensorflow utilizan funciones personalizadas. Por ejemplo, en el mismo tutorial inicial escriben una función personalizada:

Suma los cuadrados de los deltas entre el modelo actual y los datos proporcionados

squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)

En el siguiente MNIST para principiantes utilizan una entropía cruzada :

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

Como puede ver, no es tan difícil: solo necesita codificar su función en un formato tensor y usar su función básica función.

Por ejemplo, aquí está cómo puede implementar la puntuación F-beta (un enfoque general para la puntuación F1). Su fórmula es:

introduzca la descripción de la imagen aquí

Lo único que tendremos que hacer es encontrar cómo calcular true_positive, false_positive, false_negative para valores booleanos o 0/1. Si tiene vectores de valores 0/1, puede calcular cada uno de los valores como:

TP = tf.count_nonzero(actual, predicted)
FP = tf.count_nonzero((actual - 1) * predicted)
FN = tf.count_nonzero((predicted - 1) * actual)

Ahora, una vez que conozca estos valores, puede obtener fácilmente su

denom = (1 + b**2) * TP + b**2 TN + FP
Fb = (1 + b**2) * TP / denom
 7
Author: Salvador Dali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-14 05:16:22