Término de regularización personalizado de Tensorflow que compara la predicción con el valor verdadero

Dec 08 2020

Hola, necesito un término de regularización personalizado para agregar a mi función de pérdida (entropía cruzada binaria). ¿Alguien puede ayudarme con la sintaxis de Tensorflow para implementar esto? Simplifiqué todo lo más posible para que pudiera ser más fácil ayudarme.

El modelo toma un conjunto de datos 10000 de configuraciones binarias de 18 x 18 como entrada y tiene una configuración de 16x16 establecida como salida. La red neuronal consta solo de 2 capas convolucionales.

Mi modelo se ve así:

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
EPOCHS = 10
model = models.Sequential()
model.add(layers.Conv2D(1,2,activation='relu',input_shape=[18,18,1]))
model.add(layers.Conv2D(1,2,activation='sigmoid',input_shape=[17,17,1]))
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),loss=tf.keras.losses.BinaryCrossentropy())
model.fit(initial.reshape(10000,18,18,1),target.reshape(10000,16,16,1),batch_size = 1000, epochs=EPOCHS, verbose=1)
output = model(initial).numpy().reshape(10000,16,16) 

Ahora escribí una función que me gustaría usar como término de regularización adicional para tener como término de regularización. Esta función toma la verdad y la predicción. Básicamente, multiplica cada punto de ambos con su vecino "correcto". Entonces se toma la diferencia. Supuse que el término verdadero y de predicción es 16x16 (y no 10000x16x16). ¿Es esto correcto?

def regularization_term(prediction, true):
    order = list(range(1,4))
    order.append(0)
    
    deviation = (true*true[:,order]) - (prediction*prediction[:,order])
    deviation = abs(deviation)**2
    return 0.2 * deviation

Realmente agradecería algo de ayuda para agregar algo como esta función como término de regularización a mi pérdida por ayudar a la red neuronal a entrenarse mejor para esta interacción del 'vecino correcto'. Realmente estoy luchando mucho con el uso de las funcionalidades personalizables de Tensorflow. Gracias, muy agradecido.

Respuestas

2 Nikaido Dec 08 2020 at 21:50

Es muy sencillo. Debe especificar una pérdida personalizada en la que defina su término de regularización adicional. Algo como esto:

# to minimize!
def regularization_term(true, prediction):
    order = list(range(1,4))
    order.append(0)
    
    deviation = (true*true[:,order]) - (prediction*prediction[:,order])
    deviation = abs(deviation)**2
    return 0.2 * deviation

def my_custom_loss(y_true, y_pred):
    return tf.keras.losses.BinaryCrossentropy()(y_true, y_pred) + regularization_term(y_true, y_pred)


model.compile(optimizer='Adam', loss=my_custom_loss)

Como dijo keras:

Cualquier invocable con la firma loss_fn (y_true, y_pred) que devuelva una matriz de pérdidas (una de muestra en el lote de entrada) se puede pasar a compile () como pérdida. Tenga en cuenta que la ponderación de la muestra se admite automáticamente para cualquier pérdida de este tipo.

Así que asegúrese de devolver una matriz de pérdidas ( EDITAR: como puedo ver ahora, es posible devolver también un escalar simple. No importa si usa, por ejemplo, la función de reducción ). Básicamente y_true e y_predicted tienen como primera dimensión el tamaño del lote .

aquí detalles: https://keras.io/api/losses/