Verlustfunktion für die semantische Segmentierung

9

Entschuldigt sich für den Missbrauch von Fachbegriffen. Ich arbeite an einem Projekt zur semantischen Segmentierung über Faltungs-Neuronale Netze (CNNs). Beim Versuch, eine Architektur vom Typ Encoder-Decoder zu implementieren, hat die Ausgabe dieselbe Größe wie die Eingabe.

Wie gestalten Sie die Etiketten? Welche Verlustfunktion sollte man anwenden? Besonders in der Situation eines starken Klassenungleichgewichts (aber das Verhältnis zwischen den Klassen ist von Bild zu Bild variabel).

Das Problem betrifft zwei Klassen (Objekte von Interesse und Hintergrund). Ich verwende Keras mit Tensorflow-Backend.

Bisher werde ich die erwarteten Ausgaben so gestalten, dass sie die gleichen Abmessungen wie die Eingabebilder haben, und die pixelweise Beschriftung anwenden. Die letzte Ebene des Modells verfügt entweder über eine Softmax-Aktivierung (für 2 Klassen) oder eine Sigmoid-Aktivierung (um die Wahrscheinlichkeit auszudrücken, dass die Pixel zur Objektklasse gehören). Ich habe Probleme beim Entwerfen einer geeigneten Zielfunktion für eine solche Aufgabe vom Typ:

function(y_pred,y_true),

in Übereinstimmung mit Keras .

Bitte versuchen Sie, die Abmessungen der beteiligten Tensoren (Eingabe / Ausgabe des Modells) genau zu bestimmen. Alle Gedanken und Vorschläge werden sehr geschätzt. Vielen Dank !

Florin Lucaciu
quelle
Lesen Sie diese arxiv.org/pdf/1511.00561.pdf "Wir verwenden den Entropieverlust als Zielfunktion für das Training des Netzwerks."
Miss Palmer

Antworten:

5

Kreuzentropie ist definitiv der richtige Weg. Ich kenne Keras nicht, aber TF hat dies: https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

Hier ist ein Artikel, der dies direkt umsetzt: Vollfaltungsnetzwerke für die semantische Segmentierung von Shelhamer et al.

Das U-Net-Papier ist auch eine sehr erfolgreiche Umsetzung der Idee, bei der Sprungverbindungen verwendet werden, um einen Verlust der räumlichen Auflösung zu vermeiden. Sie können viele Implementierungen davon im Netz finden.

Aus meiner persönlichen Erfahrung möchten Sie vielleicht zuerst mit einem einfachen Encoder-Decoder-Netzwerk beginnen, aber keine Schritte (oder Schritte = 1) verwenden, da Sie sonst viel Auflösung verlieren, da das Upsampling nicht perfekt ist. Gehen Sie mit kleinen Kernelgrößen. Ich kenne Ihre spezifische Anwendung nicht, aber selbst ein 2-3-Netzwerk mit versteckten Schichten liefert sehr gute Ergebnisse. Verwenden Sie 32-64 Kanäle auf jeder Ebene. Starten Sie einfach, 2 versteckte Ebenen, jeweils 32 Kanäle, 3x3 Kernel, Schritt = 1 und experimentieren Sie isoliert mit Parametern, um deren Wirkung zu sehen. Halten Sie die Abmessungen für Anfänger immer gleich der Eingangsabmessung, um Auflösungsverluste zu vermeiden. Anschließend können Sie Schritte und Upsampling einschalten und Ideen wie U-Net umsetzen. U-Net eignet sich hervorragend für die Segmentierung medizinischer Bilder.

Informationen zum Klassenungleichgewicht finden Sie unter https://swarbrickjones.wordpress.com/2017/03/28/cross-entropy-and-training-test-class-imbalance/ Hier besteht die Idee darin, die verschiedenen Klassen mit und zu gewichten Parameter.βαβ


quelle
Ich bin kein Experte auf diesem Gebiet, aber sollten Klassen in dieser Umgebung nicht exklusiv sein? Wenn ja, wäre der Softmax-Verlust nicht die bessere Option? tensorflow.org/api_docs/python/tf/nn/…
Harald Thomson
1
@ HaraldThomson, Segmentierung ist ein binäres Problem. Viele Leute verwenden Softmax für binäre Probleme, aber es ist völlig unnötig und übertrieben. Anstatt zwei Ausgangsknoten zu haben, haben Sie einen Ausgangsknoten, der P darstellt (y = 1), und verwenden Sie dann die Kreuzentropie.
Ricardo Cruz
2

Verwenden Sie gewichteten Würfelverlust und gewichteten Kreuzentropieverlust. Der Würfelverlust ist sehr gut für die Segmentierung. Die Gewichte, mit denen Sie beginnen können, sollten die umgekehrten Klassenfrequenzen sein, dh nehmen Sie eine Stichprobe von beispielsweise 50-100, ermitteln Sie die mittlere Anzahl von Pixeln, die zu jeder Klasse gehören, und lassen Sie diese Klassen 1 / Mittelwert gewichten. Möglicherweise müssen Sie Würfel selbst implementieren, aber es ist einfach. Zusätzlich können Sie den inversen Würfelverlust und den Fokusverlust betrachten

Rahul Deora
quelle
-1

Lassen Sie mich zuerst genauer und dann allgemeiner sein. Ich entschuldige mich, wenn ich dich falsch verstehe.

Ich denke, Sie sprechen von der Notwendigkeit eines neuronalen Autoencoder-Netzwerks, weil Sie das Codieren und Decodieren erwähnt haben und die Eingabegröße genauso wie die Ausgabegröße erwähnt haben. Wenn ja, basiert Ihre Verlustfunktion darauf, den Eingabevektor zu reproduzieren und gleichzeitig die Daten in der mittleren verborgenen Ebene in einen kürzeren Vektor zu komprimieren. Die Wahl wäre, den minimalen mittleren quadratischen Fehler (für die Regression) oder das Logloss- oder Fehlklassifizierungsverhältnis (für die Klassifizierung) zu erreichen. CNNs sind jedoch nicht etwas, was ich in einem Autoencoder gesehen habe, aber ich denke, dass dies sowohl möglich als auch nützlich wäre, wenn die translatorische Invarianz wichtig ist, wie z. B. die Kanten- und Objekterkennung in Bildern.

Im Allgemeinen scheinen Sie ein sehr komplexes Modell des maschinellen Lernens aufzubauen, seit Sie CNNs erwähnt haben. CNNs und andere Deep-Learning-Modelle gehören zu den komplexesten Modellen des maschinellen Lernens, die es gibt.

Die Auswahl von Dimensionen, Beschriftungen und Verlustfunktionen ähnelt jedoch eher dem elementaren maschinellen Lernen. Ich denke, Sie könnten mit tiefem Lernen über Ihrem Kopf sein. Haben Sie zuerst einen Kurs über einfaches altes maschinelles Lernen besucht?

Geoffrey Anderson
quelle
Ist das überhaupt nötig? Siehe beispielsweise Pixon-Methode .
Carl
Es ist ein gültiger Ansatz: arxiv.org/pdf/1511.00561.pdf
Miss Palmer
"CNNs und andere Deep-Learning-Modelle gehören zu den komplexesten Modellen des maschinellen Lernens, die es gibt." Ich bin eher anderer Meinung. Das Modell an sich mag komplex sein, aber sie sind tatsächlich unglaublich einfach mit sehr wenig theoretischem Verständnis zu verwenden. Das ist der Grund für den ganzen Hype um DL, wenig Theorie, einfach zu schreibende Modelle und sehr hohe Genauigkeiten ...