Terme de régularisation personnalisé Tensorflow comparant la prédiction à la valeur vraie
Bonjour, j'ai besoin d'un terme de régularisation personnalisé à ajouter à ma fonction de perte (entropie croisée binaire). Quelqu'un peut-il m'aider avec la syntaxe Tensorflow pour l'implémenter? J'ai tout simplifié autant que possible pour qu'il soit plus facile de m'aider.
Le modèle prend un jeu de données 10000 de 18 x 18 configurations binaires en entrée et a un 16x16 d'un jeu de configuration en sortie. Le réseau neuronal se compose uniquement de 2 couches Convlutional.
Mon modèle ressemble à ceci:
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)
Maintenant, j'ai écrit une fonction que j'aimerais utiliser comme terme de régularisation supplémentaire pour avoir comme terme de régularisation. Cette fonction prend le vrai et la prédiction. Fondamentalement, il multiplie chaque point des deux avec son «bon» voisin. Ensuite, la différence est prise. J'ai supposé que le terme vrai et de prédiction était 16x16 (et non 10000x16x16). Est-ce correct?
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
J'apprécierais vraiment de l'aide pour ajouter quelque chose comme cette fonction comme terme de régularisation à ma perte pour aider le réseau de neurones à mieux s'entraîner à cette interaction du «bon voisin». J'ai beaucoup de mal à utiliser les fonctionnalités personnalisables de Tensorflow. Merci, très apprécié.
Réponses
C'est assez simple. Vous devez spécifier une perte personnalisée dans laquelle vous définissez votre terme d'ajout de régularisation. Quelque chose comme ça:
# 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)
Comme indiqué par Keras:
Tout appelable avec la signature loss_fn (y_true, y_pred) qui renvoie un tableau de pertes (l'un de l'échantillon dans le lot d'entrée) peut être passé à compile () comme une perte. Notez que la pondération de l'échantillon est automatiquement prise en charge pour une telle perte.
Assurez-vous donc de renvoyer un tableau de pertes ( EDIT: comme je peux le voir maintenant, il est possible de renvoyer également un simple scalaire. Peu importe si vous utilisez par exemple la fonction de réduction ). Fondamentalement, y_true et y_predicted ont comme première dimension la taille du lot .
ici les détails: https://keras.io/api/losses/