wake-up-neo.com

Holen Sie sich in Keras Präzision, Rückruf und F1-Score pro Klasse

Ich habe ein neuronales Netzwerk mit dem TensorFlow-Backend in Keras (2.1.5) trainiert und auch die Keras-contrib (2.0.8) -Bibliothek verwendet, um einen CRF-Layer als Ausgabe für das Netzwerk hinzuzufügen.

Ich würde gerne wissen, wie ich die Genauigkeit, den Rückruf und den f1-Score für jede Klasse abrufen kann, nachdem ich die Vorhersagen für ein Testset mit dem NN getroffen habe. 

5
Haritz

Angenommen, Sie haben eine Funktion get_model(), die genau das gleiche Modell erstellt, das Sie trainiert haben, und einen Pfad weights_path, der auf Ihre HDF5-Datei verweist, die Ihre Modellgewichte enthält:

model = get_model()
model.load_weights(weights_path)

Dies sollte Ihr Modell ordnungsgemäß laden. Dann müssen Sie lediglich eine ImageDataGenerator Ihrer Testdaten definieren und das Modell anpassen, um Vorhersagen zu erhalten:

# Path to your folder testing data
testing_folder = ""
# Image size (set up the image size used for training)
img_size = 256
# Batch size (you should tune it based on your memory)
batch_size = 16

val_datagen = ImageDataGenerator(
    rescale=1. / 255)
validation_generator = val_datagen.flow_from_directory(
    testing_folder,
    target_size=(img_size, img_size),
    batch_size=batch_size,
    shuffle=False,
    class_mode='categorical')

Dann können Sie das Modell veranlassen, alle Vorhersagen für Ihr gesamtes Dataset mithilfe der model.predict_generator()-Methode zu generieren:

# Number of steps corresponding to an Epoch
steps = 100
predictions = model.predict_generator(validation_generator, steps=steps)

Erstellen Sie schließlich eine Konfektionsmatrix mit der metrics.confusion_matrix()-Methode aus dem sklearn-Paket:

val_preds = np.argmax(predictions, axis=-1)
val_trues = validation_generator.classes
cm = metrics.confusion_matrix(val_trues, val_preds)

Oder holen Sie sich alle Genauigkeiten, Rückrufe und f1-Scores für alle Klassen mithilfe der metrics.precision_recall_fscore_support()-Methode von sklearn (das Argument average=None gibt Metriken für alle Klassen aus):

# label names
labels = validation_generator.class_indices.keys()
precisions, recall, f1_score, _ = metrics.precision_recall_fscore_support(val_trues, val_preds, labels=labels)

Ich habe es nicht getestet, aber ich denke, das wird Ihnen helfen.

2
Ferran Parés

Siehe meine Frage wo ich mich frage, ob ich es richtig mache. Wenn ja, kann es eine Antwort auf Ihre Frage sein.

0
yannis

Schauen Sie sich an sklearn.metrics.classification_report :

from sklearn.metrics import classification_report

y_pred = model.predict(x_test)
print(classification_report(y_true, y_pred))

gibt dir sowas

             precision    recall  f1-score   support

    class 0       0.50      1.00      0.67         1
    class 1       0.00      0.00      0.00         1
    class 2       1.00      0.67      0.80         3

avg / total       0.70      0.60      0.61         5
0
Martin Thoma