2017-04-11 1 views
2

Je suis en train d'exécuter un LSTM, et quand j'utilise le code ci-dessous:Lorsque vous utilisez mectrics dans model.compile dans keras, rapport ValueError: ('Fonction inconnue métrique', ': f1score')

model.compile(optimizer='rmsprop', loss='binary_crossentropy', 
       metrics=['accuracy', 'f1score', 'precision', 'recall']) 

Il retourne:

ValueError: ('Unknown metric function', ':f1score'). 

Je l'ai fait mes recherches et trouvé cette url: https://github.com/fchollet/keras/issues/5400

la partie « mesures » dans la partie « model.compile » dans cette URL est exactement la même que la mienne et pas de e les rovers sont retournés.

+0

Quelle est votre version de Keras (vous pouvez vérifier avec 'keras .__ version__')? f1score n'est pas disponible dans Keras 2 et vous devez le créer vous-même (un bon début pour cela serait de regarder le code 1.2.2: https://github.com/fchollet/keras/blob/1.2.2 /keras/metrics.py) –

Répondre

4

Je suppose que vous utilisez Keras 2.X. Comme expliqué dans https://keras.io/metrics/, vous pouvez créer des mesures personnalisées. Ces métriques semblent prendre uniquement (y_true, y_pred) en tant qu'arguments de fonction, donc une implémentation généralisée de fbeta n'est pas possible.

Voici une implémentation de f1_score basée sur le code source de keras 1.2.2.

import keras.backend as K 

def f1_score(y_true, y_pred): 

    # Count positive samples. 
    c1 = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) 
    c2 = K.sum(K.round(K.clip(y_pred, 0, 1))) 
    c3 = K.sum(K.round(K.clip(y_true, 0, 1))) 

    # If there are no true samples, fix the F1 score at 0. 
    if c3 == 0: 
     return 0 

    # How many selected items are relevant? 
    precision = c1/c2 

    # How many relevant items are selected? 
    recall = c1/c3 

    # Calculate f1_score 
    f1_score = 2 * (precision * recall)/(precision + recall) 
    return f1_score 

Pour utiliser, il suffit d'ajouter f1_score à votre liste de paramètres lorsque vous compilez votre modèle, après avoir défini la métrique personnalisée. Par exemple:

model.compile(loss='categorical_crossentropy', 
       optimizer='adam', 
       metrics=['accuracy',f1_score]) 
+0

Merci beaucoup! J'ai ajouté votre code dans mon projet, mais la sortie de f1_score est toujours nan, je ne sais pas comment le traiter, pouvez-vous m'aider? –

+0

'model.compile (optimiseur = 'rmsprop', loss = 'binary_crossentropy', metrics = ['precision', metric_def.f1_score])' –

+0

Pouvez-vous m'aider? –