Wie werden Caffe-Multi-Label-Daten im HDF5-Format ausgegeben?

9

Ich möchte caffe mit einem Vektorlabel verwenden, nicht ganzzahlig. Ich habe einige Antworten überprüft und es scheint HDF5 ist ein besserer Weg. Aber dann stecke ich mit einem Fehler wie:

  

accuracy_layer.cpp: 34] Prüfung fehlgeschlagen: outer_num_ * inner_num_ == bottom[1]->count() (50 vs. 200) Anzahl der Etiketten muss der Anzahl der Vorhersagen entsprechen; zB wenn die Labelachse == 1 und die Vorhersageform ist (N, C, H, W), muss die Labelanzahl (Anzahl der Labels) N*H*W sein, mit ganzzahligen Werten in {0, 1, ..., C- 1}.

mit HDF5 erstellt als:

%Vor%

Mein Netzwerk wird generiert von:

%Vor%

Es scheint, ich sollte Label-Nummer erhöhen und Dinge in Ganzzahl statt Array, aber wenn ich dies tun, beschwert sich caffe Anzahl der Daten und Label ist nicht gleich, dann existiert.

Was ist das richtige Format für Multi-Label-Daten?

Ich frage mich auch, warum niemand einfach das Datenformat schreibt, wie HDF5 Caffe Blobs zuordnet?

    
Romulus Urakagi Ts'ai 15.10.2015, 04:38
quelle

2 Antworten

22

Beantworten Sie den Titel dieser Frage:

Die HDF5-Datei sollte zwei Datensätze im Stamm haben, die "Daten" bzw. "Label" heißen. Die Form ist ( data amount , dimension ). Ich verwende nur eindimensionale Daten, daher bin ich nicht sicher, in welcher Reihenfolge channel , width und height stehen. Vielleicht ist es egal. dtype sollte float oder double sein.

Ein Beispielcode, der einen Zugsatz mit h5py erstellt, ist:

%Vor%

Auch die Genauigkeitsschicht wird nicht benötigt, das Entfernen ist einfach. Nächstes Problem ist die Verlustschicht. Da SoftmaxWithLoss nur eine Ausgabe hat (Index der Dimension mit maximalem Wert), kann sie nicht für Multi-Label-Probleme verwendet werden. Dank Adian und Shai finde ich SigmoidCrossEntropyLoss in diesem Fall gut.

Im Folgenden finden Sie den vollständigen Code von der Datenerstellung über das Trainingsnetzwerk bis zum Erhalten des Testergebnisses:

  

main.py (modifiziert von caffe lanet)

%Vor%

h5list-Dateien enthalten einfach Pfade von h5-Dateien in jeder Zeile:

  

train.h5list

%Vor%
  

test.h5list

%Vor%

und der Solver:

  

auto_solver.prototxt

%Vor%

Konvergenzdiagramm:

Letztes Batch-Ergebnis:

%Vor%

Ich denke, dass dieser Code noch viele Dinge zu verbessern hat. Jeder Vorschlag wird geschätzt.

    
Romulus Urakagi Ts'ai 16.10.2015, 09:05
quelle
1

Ihre Genauigkeitsebene macht keinen Sinn.

Die Art und Weise, in der die Genauigkeitsebene funktioniert : in Vektor und
(ii) Grundwahrheit entsprechend Skalar Ganzzahl-Label.
Die Genauigkeitsschicht überprüft dann, ob die Wahrscheinlichkeit der vorhergesagten Markierung tatsächlich die maximale (oder innerhalb von top_k ) ist Wenn Sie also C verschiedene Klassen klassifizieren müssen, werden Ihre Eingaben N -by- C sein (wobei N die Batch-Größe ist) eingegebene vorhergesagte Wahrscheinlichkeiten für N Samples, die zu jedem der% gehören. co_de% classes und C labels.

Wie es in Ihrem Netz definiert ist: Sie geben die Genauigkeitsschicht N -by-4-Vorhersagen und N -by-4-Bezeichnungen ein - dies ergibt keinen Sinn für caffe.

    
Shai 15.10.2015 06:18
quelle