2017-02-08 5 views
8

Ich bin mir ziemlich sicher, dass dies eine dumme Frage ist, aber ich kann es nirgendwo anders finden, also werde ich es hier fragen.Kreuz Entropie Verlust für Semantische Segmentierung Keras

Ich mache semantische Bildsegmentierung mit einem CNN (Unet) in Keras mit 7 Etiketten. 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 ist und was das prinzipielle Ziel ist?

Antwort

10

Binär-Cross-Entropie-Verlust sollte mit sigmod Aktivierung in der letzten Schicht verwendet werden und es bestraft 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.

Jetzt zu erzwingen, der vorherige von einem heißen Code ist softmax Aktivierung mit kategorischer Kreuz-Entropie zu verwenden. Das sollten Sie verwenden.

Jetzt das Problem ist die Verwendung der softmax in Ihrem Fall als Keras nicht softmax auf jedem Pixel unterstützen.

Der einfachste Weg, um darüber zu gehen ist permute die Dimensionen (n_rows, n_cols, 7) Permute Schicht verwendet und umformen es dann zu (n_rows * n_cols, 7) mit Reshape Schicht. Dann können Sie die Aktivierungsschicht softmax hinzufügen und den Verlust von crosssetopy verwenden. Die Daten sollten entsprechend neu gestaltet werden.

Der andere Weg, dies zu tun wird Tiefen softmax zu implementieren:

def depth_softmax(matrix): 
    sigmoid = lambda x: 1/(1 + K.exp(-x)) 
    sigmoided_matrix = sigmoid(matrix) 
    softmax_matrix = sigmoided_matrix/K.sum(sigmoided_matrix, axis=0) 
    return softmax_matrix 

und als Lambda-Schicht verwenden:

model.add(Deconvolution2D(7, 1, 1, border_mode='same', output_shape=(7,n_rows,n_cols))) 
model.add(Permute(2,3,1)) 
model.add(BatchNormalization()) 
model.add(Lambda(depth_softmax)) 

Wenn tfimage_dim_ordering verwendet wird, dann können Sie Art und Weise tun mit den Permute Schichten.

Für weitere Referenz überprüfen here.

+0

Vielen Dank für Ihre sehr detaillierte Antwort! Ich ging mit der Umformung, Softmax und kategorischer Cross-Entropie. Würden Sie erwarten, dass es zwischen den beiden Methoden erhebliche Leistungsunterschiede in Bezug auf Geschwindigkeit oder Endgenauigkeit gibt? Danke noch einmal! – TSW

+0

Ich habe nicht selbst an diesem Szenario gearbeitet, aber Sie können beide überprüfen. Eine andere Sache, die du ausprobieren kannst, ist, zuerst ein Modell mit finaler Ebene als "Sigmoid" und binären Cross-Entropie-Verlust zu erstellen und nach dem Training die oberste Ebene zu ersetzen und mit "softmax" zu enden und mit kategorischer Kreuz-Entropie fortzuschreiten. Das 2. Training wird schnell konvergieren, aber ich würde darauf wetten, dass die Trainingszeit insgesamt kürzer wird und eine bessere Genauigkeit hat. – indraforyou

+0

Hi indraforyou, ich arbeite auch an einer semantischen Segmentierung Fall. Das maskierte Bild wird als (1, n_Rows, n_cols) dargestellt. Kann ich für diesen Fall sigmoidale und binäre Cross-Entropien verwenden? Gibt es spezielle Verfahren? – user297850

Verwandte Themen