web-dev-qa-db-fra.com

Fonction de perte personnalisée en keras

Je travaille sur une approche de classificateur incrémentielle par classe d'image utilisant un CNN comme extracteur de caractéristiques et un bloc entièrement connecté pour la classification.

Premièrement, j'ai peaufiné un réseau de VGG formé pour effectuer une nouvelle tâche. Une fois que le réseau est formé à la nouvelle tâche, je stocke des exemples pour chaque classe afin d’éviter d’oublier les nouvelles classes disponibles.

Lorsque certaines classes sont disponibles, je dois calculer chaque sortie des exemples inclus les exemples pour les nouvelles classes. Maintenant, en ajoutant des zéros aux sorties des anciennes classes et en ajoutant l’étiquette correspondant à chaque nouvelle classe sur les sorties des nouvelles classes, j’ai mes nouvelles étiquettes, c.-à-d. Si 3 nouvelles classes entrent ...

Ancien type de classe: [0.1, 0.05, 0.79, ..., 0 0 0]

Nouvelle sortie de type classe: [0.1, 0.09, 0.3, 0.4, ..., 1 0 0] ** les dernières sorties correspondent à la classe.

Ma question est, comment je peux changer la fonction de perte pour un personnalisé pour former pour les nouvelles classes? La fonction de perte que je veux implémenter est définie comme suit:

loss function

où la perte de distillation correspond aux sorties des anciennes classes pour ne pas oublier, et la perte de classification correspond aux nouvelles classes.

Si vous pouvez me fournir un exemple de code pour modifier la fonction de perte dans keras, ce serait bien.

Merci!!!!!

36
Eric

Tout ce que vous avez à faire est de définir une fonction pour cela, en utilisant les fonctions de base de keras pour les calculs. La fonction doit prendre les valeurs vraies et les valeurs prédites du modèle.

Maintenant, comme je ne suis pas sûr de ce que sont g, q, x et y dans votre fonction, je vais simplement créer un exemple de base ici sans me soucier de ce que cela signifie ou de savoir s'il s'agit d'une fonction réellement utile:

import keras.backend as K

def customLoss(yTrue,yPred):
    return K.sum(K.log(yTrue) - K.log(yPred))

Toutes les fonctions principales peuvent être vues ici: https://keras.io/backend/#backend-functions

Après cela, compilez votre modèle en utilisant cette fonction au lieu d’une autre:

model.compile(loss=customLoss, optimizer = .....)
61
Daniel Möller