Wie bekomme ich Vorhersagen mit predict_generator zum Streaming von Testdaten in Keras?

16

Im Keras-Blog zum Training von Convnets von Grund auf wird im Code nur das Netzwerk angezeigt , das mit Trainings- und Validierungsdaten ausgeführt wird. Was ist mit Testdaten? Entsprechen die Validierungsdaten den Testdaten (glaube ich nicht)? Wenn ein separater Testordner in ähnlichen Zeilen wie der Zug- und der Validierungsordner vorhanden ist, wie erhalten wir eine Verwirrungsmatrix für die Testdaten? Ich weiß, dass wir dazu Scikit Learn oder ein anderes Paket verwenden müssen, aber wie erhalte ich etwas in der Art klassenmäßiger Wahrscheinlichkeiten für Testdaten? Ich hoffe, dies für die Verwirrungsmatrix zu nutzen.

Raghuram
quelle
1
Sie können die Funktion model.predict_generator (...) mit einem Generator aufrufen, der Daten aus einem Verzeichnis liest, das den Testsatz enthält. Es gibt die Vorhersagen zurück, mit denen Sie eine Verwirrungsmatrix berechnen können. Ist es das, wonach du suchst? Siehe hier für Dokumente: keras.io/models/sequential
stmax
1
Ja, das habe ich gesehen. predict_generator gibt eine Liste von Vorhersagen zurück, die eine Liste von Gleitkommawerten zwischen 0 und 1 ist. Wie interpretiere ich das? Es kann nicht direkt mit der Verwirrungsmatrix verwendet werden.
Raghuram
2
Ich habe predict_generator noch nicht ausprobiert (es ist ziemlich neu), aber es scheint Klassenwahrscheinlichkeiten zurückzugeben. Versuchen Sie, Werte <= 0,5 in 0 und> 0,5 in 1 umzuwandeln. Wenn Sie eine Liste mit 0en und 1en haben, können Sie sie der Funktion zur Berechnung der Verwirrungsmatrix hinzufügen.
stmax
2
Abgesehen davon funktioniert dies gut für Zweiklassenprobleme, aber was ist, wenn es mehr als zwei Klassen gibt?
Raghuram
1
Wenn es mehr als zwei Klassen gibt, benötigt Ihr Netzwerk mehr als einen Ausgang. Für n Klassen haben Sie n Ausgaben und Sie sagen die Klasse voraus, die die höchste Ausgabe hat. Schauen Sie sich die Softmax-Funktion an ( en.wikipedia.org/wiki/Softmax_function ).
stmax

Antworten:

15

Um eine Verwirrungsmatrix aus den Testdaten zu erhalten, müssen Sie zwei Schritte ausführen:

  1. Machen Sie Vorhersagen für die Testdaten

Verwenden Sie beispielsweise, model.predict_generatorum die ersten 2000 Wahrscheinlichkeiten vom Testgenerator vorherzusagen.

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. Berechnen Sie die Verwirrungsmatrix basierend auf den Etikettenvorhersagen

Vergleichen Sie beispielsweise die Wahrscheinlichkeiten mit dem Fall, dass 1000 Katzen bzw. 1000 Hunde vorhanden sind.

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)

Zusätzlicher Hinweis zu Test- und Validierungsdaten

Die Keras-Dokumentation verwendet drei verschiedene Datensätze: Trainingsdaten, Validierungsdaten und Testdaten. Trainingsdaten werden verwendet, um die Modellparameter zu optimieren. Die Validierungsdaten werden verwendet, um eine Auswahl über die Metaparameter zu treffen, z. B. die Anzahl der Epochen. Nach der Optimierung eines Modells mit optimalen Metaparametern werden die Testdaten verwendet, um eine faire Schätzung der Modellleistung zu erhalten.

Pieter
quelle
2
Danke für die Code-Schnipsel. Könnten Sie diese beiden verbinden? In Ihrem Beispiel scheint y_true mit Dummy-Daten gefüllt zu sein. Würden Sie generator.classes verwenden, um das Array zu füllen?
Gegenwind
Ich bin nicht sicher, aber ich denke, stattdessen np.array([0] * 1000 + [1] * 1000)können Sie das gleiche Array erhalten, indem Siegenerator.classes
Mehdi Nellen
2

Hier ist ein Code, den ich ausprobiert und für mich gearbeitet habe:

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)

Sie können dann verwenden:

print (confusion matrix(predicted_class_indices,labels)

Stellen Sie sicher, dass Sie shuffle=FalseIhren Testgenerator verwenden (in meinem Fall den Validierungsgenerator), und setzen Sie ihn mit zurück, validation_generator.reset()bevor Sie Ihre Vorhersagen treffen.

ranahd
quelle
0

Für die Verwirrungsmatrix müssen Sie das sklearn-Paket verwenden. Ich glaube nicht, dass Keras eine Verwirrungsmatrix liefern kann. Rufen Sie zum Vorhersagen von Werten für den Testsatz einfach die model.predict () - Methode auf, um Vorhersagen für den Testsatz zu generieren. Die Art der Ausgabewerte hängt von Ihrem Modelltyp ab, dh entweder von diskreten oder von Wahrscheinlichkeiten.

enterML
quelle
Danke für die Antwort. Ich weiß, dass Keras kein eigenes Verwirrungsmatrix-Paket hat. Meine Frage ist, dass model.predict_generator eine Liste von Gleitkommawerten zurückgibt, die nicht zur Berechnung der Verwirrungsmatrix verwendet werden können.
Raghuram
Mit welchen Daten experimentieren Sie?
enterML
Ich arbeite an Bildern.
Raghuram