Multi-Label-Klassifizierung mit Caffe

8

Ich möchte GoogLeNet für eine Multi-Label-Klassifizierung mit Caffe optimieren. Ich habe es bereits auf eine Single-Label-Klassifizierung abgestimmt, aber ich kann noch nicht auf Multi-Label umsteigen.

Die wichtigsten Schritte, die ich mache, sind unterschiedlich:

Erstellen Sie LMDB für Data & amp; Grundwahrheit

Ich ändere den Code hier und hier , um eine LMDB mit den Daten und die andere mit der Grundwahrheit zu erstellen.

Ersetzen von SoftmaxWithLoss durch SigmoidCrossEntropyLoss

Ich aktualisiere den train_val.prototxt, ich ersetze SoftmaxWithLoss-Layer zu SigmoidCrossEntropyLoss, und setze die Daten-Layer so, dass beide DB's geladen werden. Ich habe die Lernrate-Parameter so eingestellt, wie ich es bei dem Ein-Label-Klassifikationsproblem getan habe.

Diese Schritte scheinen zu funktionieren. Der Datenfluss und es ist möglich, solver.step (1) durchzuführen. Um zu überprüfen, ob die Daten und Beschriftungen richtig geladen sind, habe ich explizit den Verlust mithilfe der Formel berechnet und habe das gleiche Ergebnis wie Caffe erhalten.

Problem

Das Netzwerk konvergiert nicht. Wenn Sie mehrere Hundert Iterationen ausführen, wird jede der verschiedenen Klassen um die Klassenpopulation herum gemittelt. Das heißt, wenn Klasse a 0,35 1 und 0,65 0 in der Population hat, konvergiert das Netzwerk für jede Beobachtung zu einer Wahrscheinlichkeit von 0,35, unabhängig von der wahren Bezeichnung.

Möglicher Fehler 1

Ich vermute, das Problem liegt darin, dass ich die Bilder nicht korrekt in Caffe laden kann, so wie das vortrainierte GoogLeNet-Modell von ihnen lernen kann. Meine bisherigen Erfahrungen sind convert_imageset was perfekt funktioniert. Im Moment verwende ich Shelahamer-Code, um die Bilder in der LMDB zu speichern:

%Vor%

Ich normalisiere den Mittelwert in der Datenschicht beim Laden des Bildes. Scheint das richtig? Gibt es einen anderen Weg, das zu tun?

Möglicher Fehler 2

Es könnte auch sein, dass der train_val.prototxt falsch definiert wurde. Gibt es noch etwas anderes als das Umschalten des SoftmaxWithLoss - & gt; SigmoidCrossEntropyLoss?

Jede Hilfe wird sehr geschätzt! Danke!

    
YotamH 20.10.2015, 05:37
quelle

1 Antwort

0

In GoogLeNet Eingabedaten sollten subtrahiert werden durch:

%Vor%     
Ilya Ovodov 12.02.2018 16:43
quelle

Tags und Links