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?
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 .
Tags und Links image-processing deep-learning keras