2017-10-06 4 views
0

Je n'arrive pas à ajouter une pénalité à binary_crossentropy. L'idée est de pénaliser la fonction de perte lorsque la moyenne des groupes d'erreurs prédéfinis dépasse un certain seuil. Voici la fonction d'assistance qui prend le masque exprimant les groupes et l'entropie déjà calculée. Il retournera simplement le nombre de fois où un seuil a été franchi pour pénaliser la fonction de perte réelle l'appelant.Problème avec la fonction de perte personnalisée dans Keras

def penalty(groups_mask, binary_crossentropy): 
    errors = binary_crossentropy 
    unique_groups = set(groups_mask) 
    groups_mask = np.array(groups_mask) 
    threshold = # whatever 
    c = 0 
    for group in unique_groups: 
     error_mean = K.mean(errors[(groups_mask == group).nonzero()], axis=-1) 
     if error_mean > threshold: 
     c += 1 
    return c 

Le problème est que error_mean est pas un scalaire et je ne peux pas trouver une façon simple de le comparer à seuil.

+0

Je peux vraiment Ne pas comprendre ce que vous voulez atteindre dans cette ligne: 'error_mean = K.mean (erreurs [(groups_mask == groupe) .nonzero()], axis = -1)' –

Répondre

2

Vous devez faire tout en utilisant tenseurs et fonctions des keras backend

import keras.backend as K 

Dans la ligne de l'erreur, vous devez comparer les choses en utilisant ces fonctions aussi:

.... 
c = K.variable([0]) 
..... 
..... 
    errorGreater = K.cast(K.greater(error_mean,threshold), K.floatx()) 
    c+=K.max(errorGreater) #if error_mean is 1 element only, you can just c+=errorGreater. 
+0

Je pense que theano vous permet de ne pas utiliser 'cast '. –