Warum ist binary_crossentropy genauer als categorical_crossentropy für die Klassifizierung von Klassen in Keras?

9

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%     
Leo Jiang 26.12.2016, 07:02
quelle

2 Antworten

6

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:

%Vor%

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:

%Vor%

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 .

    
desertnaut 01.09.2017 16:41
quelle
1

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.

    
Labo 28.01.2017 19:34
quelle