J'ai formé un réseau de neurones à l'aide du backend TensorFlow dans Keras (2.1.5) et de la bibliothèque keras-contrib (2.0.8) afin d'ajouter une couche CRF en sortie du réseau.
Je voudrais savoir comment obtenir la précision, le rappel et le score F1 pour chaque classe après avoir effectué les prédictions sur un ensemble de tests utilisant le NN.
Supposons que vous avez une fonction get_model()
qui construit votre modèle identique à celui que vous avez formé et un chemin weights_path
pointant vers votre fichier HDF5 contenant les poids de votre modèle:
model = get_model()
model.load_weights(weights_path)
Cela devrait charger votre modèle correctement. Ensuite, il vous suffit de définir une ImageDataGenerator
de vos données de test et d’adapter le modèle pour obtenir des prédictions:
# 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')
Ensuite, vous pouvez faire en sorte que le modèle génère toutes les prédictions sur l'ensemble de votre jeu de données à l'aide de la méthode model.predict_generator()
:
# Number of steps corresponding to an Epoch
steps = 100
predictions = model.predict_generator(validation_generator, steps=steps)
Enfin, créez une matrice de confusion en utilisant la méthode metrics.confusion_matrix()
du package sklearn
:
val_preds = np.argmax(predictions, axis=-1)
val_trues = validation_generator.classes
cm = metrics.confusion_matrix(val_trues, val_preds)
Ou obtenez toutes les précisions, rappels et scores f1 pour toutes les classes en utilisant la méthode metrics.precision_recall_fscore_support()
à partir de sklearn
(l'argument average=None
génère des métriques pour toutes les classes):
# label names
labels = validation_generator.class_indices.keys()
precisions, recall, f1_score, _ = metrics.precision_recall_fscore_support(val_trues, val_preds, labels=labels)
Je ne l'ai pas testé, mais je suppose que cela vous aidera.
Voir ma question où je me demande si je le fais bien. Si oui, alors cela pourrait être une réponse à votre question.
Regardez sklearn.metrics.classification_report
:
from sklearn.metrics import classification_report
y_pred = model.predict(x_test)
print(classification_report(y_true, y_pred))
vous donne quelque chose comme
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