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?
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:
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:
%Vor%main.py (modifiziert von caffe lanet)
h5list-Dateien enthalten einfach Pfade von h5-Dateien in jeder Zeile:
%Vor%train.h5list
%Vor%test.h5list
und der Solver:
%Vor%auto_solver.prototxt
Letztes Batch-Ergebnis:
%Vor%Ich denke, dass dieser Code noch viele Dinge zu verbessern hat. Jeder Vorschlag wird geschätzt.
Ihre Genauigkeitsebene macht keinen Sinn.
Die Art und Weise, in der die Genauigkeitsebene funktioniert : in caffe 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.
Tags und Links python neural-network deep-learning caffe