Comment obtenir des prédictions avec Predict_Generator sur la diffusion en continu de données de test dans Keras?

16

Dans le blog Keras sur la formation des convnets à partir de zéro , le code affiche uniquement le réseau fonctionnant sur les données de formation et de validation. Qu'en est-il des données de test? Les données de validation sont-elles les mêmes que les données de test (je pense que non). S'il y avait un dossier de test distinct sur des lignes similaires à celles des dossiers de train et de validation, comment obtenir une matrice de confusion pour les données de test. Je sais que nous devons utiliser scikit learn ou un autre package pour ce faire, mais comment puis-je obtenir quelque chose dans le sens des probabilités de classe pour les données de test? J'espère l'utiliser pour la matrice de confusion.

Raghuram
la source
1
Vous pouvez appeler la fonction model.predict_generator (...) avec un générateur qui lit les données d'un répertoire contenant l'ensemble de test. Il renvoie les prédictions, que vous pouvez utiliser pour calculer une matrice de confusion. C'est ça que vous cherchez? Voir ici pour les documents: keras.io/models/sequential
stmax
1
Oui, je l'ai vu. Predict_Generator renvoie une liste de prédictions qui est une liste de valeurs flottantes entre 0 et 1. Comment interpréter cela? Il ne peut pas être utilisé directement avec la matrice de confusion.
Raghuram
2
Je n'ai pas encore essayé Predict_Generator (c'est plutôt nouveau), mais il semble renvoyer des probabilités de classe. Essayez de convertir des valeurs <= 0,5 à 0 et> 0,5 à 1. Une fois que vous avez une liste composée de 0 et de 1, vous pouvez l'alimenter à la fonction de calcul de la matrice de confusion.
stmax
2
En passant, cela fonctionnera bien pour deux problèmes de classe, mais que faire s'il y a plus de deux classes?
Raghuram
1
S'il existe plus de deux classes, votre réseau a besoin de plusieurs sorties. Pour n classes, vous avez n sorties et vous prédisez la classe qui a la sortie la plus élevée. Jetez un œil à la fonction softmax ( en.wikipedia.org/wiki/Softmax_function ).
stmax

Réponses:

15

Pour obtenir une matrice de confusion à partir des données de test, vous devez passer par deux étapes:

  1. Faire des prédictions pour les données de test

Par exemple, utilisez model.predict_generatorpour prédire les 2000 premières probabilités du générateur de test.

generator = datagen.flow_from_directory(
        'data/test',
        target_size=(150, 150),
        batch_size=16,
        class_mode=None,  # only data, no labels
        shuffle=False)  # keep data in same order as labels

probabilities = model.predict_generator(generator, 2000)
  1. Calculez la matrice de confusion sur la base des prédictions d'étiquette

Par exemple, comparez les probabilités avec le cas où il y a respectivement 1000 chats et 1000 chiens.

from sklearn.metrics import confusion_matrix

y_true = np.array([0] * 1000 + [1] * 1000)
y_pred = probabilities > 0.5

confusion_matrix(y_true, y_pred)

Remarque supplémentaire sur les données de test et de validation

La documentation Keras utilise trois ensembles de données différents: les données d'apprentissage, les données de validation et les données de test. Les données d'apprentissage sont utilisées pour optimiser les paramètres du modèle. Les données de validation sont utilisées pour faire des choix sur les méta-paramètres, par exemple le nombre d'époques. Après avoir optimisé un modèle avec des méta-paramètres optimaux, les données de test sont utilisées pour obtenir une estimation juste des performances du modèle.

Pieter
la source
2
Merci pour les extraits de code. Pourriez-vous relier ces deux? Dans votre exemple, y_true semble être rempli de données factices. Souhaitez-vous utiliser generator.classes pour remplir le tableau?
Gegenwind
Je ne suis pas certain, mais je pense qu'au lieu de np.array([0] * 1000 + [1] * 1000)vous, vous pouvez obtenir le même tableau en faisantgenerator.classes
Mehdi Nellen
2

Voici un code que j'ai essayé et travaillé pour moi:

pred= model.predict_generator(validation_generator, nb_validation_samples // batch_size)
predicted_class_indices=np.argmax(pred,axis=1)
labels = (validation_generator.class_indices)
labels2 = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
print(predicted_class_indices)
print (labels)
print (predictions)

Vous pouvez ensuite utiliser:

print (confusion matrix(predicted_class_indices,labels)

Assurez-vous que vous utilisez shuffle=Falsedans votre générateur de test (dans mon cas, c'est un générateur de validation) et réinitialisez-le en utilisant validation_generator.reset()avant de faire vos prédictions.

ranahd
la source
0

Pour la matrice de confusion, vous devez utiliser le package sklearn. Je ne pense pas que Keras puisse fournir une matrice de confusion. Pour prédire des valeurs sur l'ensemble de test, il suffit d'appeler la méthode model.predict () pour générer des prédictions pour l'ensemble de test. Le type de valeurs de sortie dépend de votre type de modèle, c'est-à-dire discret ou probabilités.

enterML
la source
Merci d'avoir répondu. Je sais que Keras n'a pas son propre paquet de matrice de confusion. Ma question est que model.predict_generator renvoie une liste de valeurs flottantes qui ne peuvent pas être utilisées pour calculer la matrice de confusion.
Raghuram du
Sur quel type de données expérimentez-vous?
enterML
Je travaille sur des images.
Raghuram