Ich lerne, wie man mit Keras konvolutionelle neuronale Netzwerke erzeugt. Ich versuche eine hohe Genauigkeit für den MNIST-Datensatz zu erhalten.
Offenbar ist categorical_crossentropy
für mehr als 2 Klassen und binary_crossentropy
für 2 Klassen. Da es 10 Ziffern gibt, sollte ich categorical_crossentropy
verwenden. Nach dem Training und Testen von Dutzenden von Modellen übertrifft binary_crossentropy
jedoch konsistent categorical_crossentropy
signifikant.
Bei Kaggle habe ich eine Genauigkeit von 99 +% mit binary_crossentropy
und 10 Epochen erreicht. Inzwischen kann ich mit categorical_crossentropy
nicht mehr als 97% erreichen, sogar mit 30 Epochen (das ist nicht viel, aber ich habe keine GPU, also dauert das Training ewig).
So sieht mein Modell jetzt aus:
%Vor%Kurze Antwort: Es ist nicht .
Um das zu sehen, versuchen Sie einfach, die Genauigkeit "von Hand" zu berechnen, und Sie werden sehen, dass sie sich von der von Keras mit der Methode model.evaluate
angegebenen unterscheidet:
Der Grund, warum so aussieht ist ein eher subtiles Problem, wie Keras tatsächlich rät, welche Genauigkeit Sie je nach der gewählten Verlustfunktion verwenden müssen, wenn Sie Fügen Sie einfach metrics=['accuracy']
in Ihre Modellkompilierung ein.
Wenn Sie den Quellcode überprüfen, definiert Keras keine einzelne Genauigkeitsmetrik , aber mehrere verschiedene, darunter binary_accuracy
und categorical_accuracy
. Was passiert unter der Haube ist das, seit du ausgewählt hast binäre Kreuzentropie als Ihre Verlustfunktion und haben keine bestimmte Genauigkeitsmetrik angegeben. Keras (fälschlicherweise ...) folgert, dass Sie an binary_accuracy
interessiert sind, und das ist es, was es zurückgibt.
Um das zu vermeiden, dh um die binäre Kreuzentropie als Ihre Verlustfunktion zu verwenden (im Prinzip nichts damit zu tun), während Sie immer noch die kategorische Genauigkeit erhalten, die für das Problem erforderlich ist (dh MNIST-Klassifikation) ), sollten Sie explizit nach categorical_accuracy
in der Modellkompilierung wie folgt fragen:
Und nach dem Training, Scoring und der Vorhersage des Test-Sets, wie ich es oben gezeigt habe, sind die beiden Metriken jetzt die gleichen, wie sie sein sollten:
%Vor%(HT zu diese großartige Antwort zu ein ähnliches Problem, das mir geholfen hat, das Problem zu verstehen ...)
UPDATE : Nach meinem Post habe ich festgestellt, dass dieses Problem bereits in diese Antwort .
Zunächst ist binary_crossentropy nicht, wenn es zwei Klassen gibt.
Der Name "binär" ist, weil er für die binäre Ausgabe angepasst ist, und jede Zahl von softmax soll 0 oder 1 sein. Hier wird nach jeder Nummer der Ausgabe gesucht.
Es erklärt Ihr Ergebnis nicht, da categorical_entropy die Tatsache ausnutzt, dass es sich um ein Klassifikationsproblem handelt.
Sind Sie sicher, dass beim Lesen Ihrer Daten nur eine Klasse pro Beispiel vorhanden ist? Das ist die einzige Erklärung, die ich geben kann.
Tags und Links neural-network machine-learning keras conv-neural-network kaggle