Kreuz-Entropie-Verlust für semantische Segmentierung Keras

8

Ich bin mir ziemlich sicher, dass das eine dumme Frage ist, aber ich kann sie nirgendwo anders finden, also werde ich sie hier fragen.

Ich mache eine semantische Bildsegmentierung mit einem cnn (unet) in Keras mit 7 Labels. Also ist meine Bezeichnung für jedes Bild (7, n_rows, n_cols) das theano Backend. Also über die 7 Ebenen für jedes Pixel, es ist One-Hot-codiert. Ist in diesem Fall die korrekte Fehlerfunktion eine kategorische Kreuz-Entropie zu verwenden? Es scheint mir so, aber das Netzwerk scheint mit binärem Kreuz-Entropie-Verlust besser zu lernen. Kann jemand etwas darüber sagen, warum das so sein sollte und was das prinzipielle Ziel ist?

    
TSW 08.02.2017, 16:41
quelle

1 Antwort

10

Der binäre Cross-Entropie-Verlust sollte mit sigmod -Aktivierung in der letzten Schicht verwendet werden, und er benachteiligt stark entgegengesetzte Vorhersagen. Es wird nicht berücksichtigt, dass die Ausgabe ein One-Hot-Code ist und die Summe der Vorhersagen sollte 1. Aber wie falsche Vorhersagen stark bestrafen das Modell lernt etwas richtig zu klassifizieren.

Um den Prior von One-Hot-Code zu erzwingen, verwenden Sie softmax activation mit kategorischer Kreuz-Entropie. Das sollten Sie verwenden.

Jetzt ist das Problem, dass Sie in Ihrem Fall softmax verwenden, da Keras softmax auf jedem Pixel nicht unterstützt.

Am einfachsten ist es, die Dimensionen mit Permute layer auf (n_rows, n_cols, 7) zu multiplizieren und dann mit Reshape layer zu (n_rows * n_cols, 7) umzuformen. Dann können Sie die softmax Aktivierungsschicht hinzufügen und den Verlust von crosssetopy verwenden. Die Daten sollten auch entsprechend neu gestaltet werden.

Der andere Weg ist die Implementierung von depth-softmax:

%Vor%

und verwenden Sie es als Lambda-Layer:

%Vor%

Wenn tf image_dim_ordering verwendet wird, dann können Sie mit den Permute Ebenen umgehen.

Weitere Informationen finden Sie hier .

    
indraforyou 09.02.2017, 03:15
quelle