9

Ich trainiere eine RNN mit Keras und würde gerne sehen, wie sich die Validierungsgenauigkeit mit der Datensatzgröße ändert. Keras hat in seinem History-Objekt eine Liste namens val_acc, die nach jeder Epoche mit der entsprechenden Validierungs-Set-Genauigkeit (link to the post in google group) angehängt wird. Ich möchte den Durchschnitt von val_acc für die Anzahl der Epochen abrufen und diese gegen die entsprechende Datensatzgröße plotten.Wie zeichne ich eine Lernkurve für ein Keras-Experiment?

Frage: Wie kann ich die Elemente in der val_acc Liste abrufen und eine Operation wie numpy.mean(val_acc) durchführen?


EDIT: Wie @runDOSrun sagte, immer den Mittelwert der val_acc s macht keinen Sinn. Lassen Sie mich auf das endgültige val_acc konzentrieren.

Ich habe versucht, was von @nemo vorgeschlagen wurde, aber kein Glück. Hier ist, was ich habe, wenn ich

model.fit(X_train, y_train, batch_size = 512, nb_epoch = 5, validation_split = 0.05).__dict__

Ausgabe drucken:

{'model': <keras.models.Sequential object at 0x000000001F752A90>, 'params': {'verbose': 1, 'nb_epoch': 5, 'batch_size': 512, 'metrics': ['loss', 'val_loss'], 'nb_sample': 1710, 'do_validation': True}, 'epoch': [0, 1, 2, 3, 4], 'history': {'loss': [0.96936064512408959, 0.66933631673890948, 0.63404161288724303, 0.62268789783555867, 0.60833334699708819], 'val_loss': [0.84040999412536621, 0.75676006078720093, 0.73714292049407959, 0.71032363176345825, 0.71341043710708618]}} 

Es stellt sich heraus, es gibt keine Liste als val_acc in meiner Geschichte Wörterbuch.

Frage: Wie man val_acc in das history Wörterbuch einbindet?

Antwort

2

Das Verlaufsobjekt wird erstellt, während fit() das Modell erstellt wird. Details finden Sie unter keras/engine/training.py.

Sie können auf die Historie mit dem Attribut history auf dem Modell zugreifen: model.history.

Nach dem Anpassen des Modells wird einfach über das Attribut gemittelt.

Beachten Sie, dass das Muster val_<your output name here> für jeden von Ihnen angegebenen Ausgang ist.

+0

Danke für die Antwort @nemo, können Sie zugreifen einen Blick auf meinen letzten Schnitt werfen? – akilat90

2

Warum finden Sie die durchschnittliche Genauigkeit wichtiger als die endgültige Genauigkeit? Abhängig von Ihren anfänglichen Werten kann Ihr Durchschnitt ziemlich irreführend sein. Es ist einfach, verschiedene Kurven mit den gleichen durchschnittlichen aber unterschiedlichen Interpretationen zu erstellen.

Ich würde nur die vollständige Geschichte von train_acc und val_acc plotten, um zu entscheiden, ob die RNN innerhalb der gegebenen Einrichtung gut funktioniert. Und vergessen Sie nicht, eine Stichprobengröße N> 1 zu haben. Die zufällige Initialisierung kann einen großen Einfluss auf RNNs haben, nehmen Sie mindestens N = 10 verschiedene Initialisierungen für jedes Setup, um sicherzustellen, dass die unterschiedliche Leistung tatsächlich von Ihrer Satzgröße verursacht wird und nicht durch bessere/schlechtere Initialisierungen.

+1

danke, dass ich darüber nachgedacht habe. Ja, ich lag falsch und ignorierte einfach die Tatsache, dass das Netzwerk in jeder Epoche besser wird. In diesem Sinne würde, wie du schon sagtest, es genügen, das letzte 'val_acc 'zu bekommen. – akilat90

3

Um Genauigkeitswerte zu erhalten, müssen Sie anfordern, dass sie während fit berechnet werden, da die Genauigkeit keine objektive Funktion, sondern eine (allgemeine) Metrik ist. Manchmal ist die Berechnung der Genauigkeit nicht sinnvoll, daher ist sie in Keras nicht standardmäßig aktiviert. Es ist jedoch eine integrierte Metrik und einfach hinzuzufügen.

die Metrik hinzuzufügen, verwendet metrics=['accuracy'] Parameter model.fit:

In Ihrem Beispiel:

history = model.fit(X_train, y_train, batch_size = 512, 
      nb_epoch = 5, validation_split = 0.05, metrics=['accuracy']) 

Sie dann Validierung Genauigkeit als history.history['val_acc']