Wie zu ernähren caffe multi-label-Daten im HDF5-format?
Will ich mit caffe mit einem Vektor-label, nicht integer. Ich habe einige Antworten, und es scheint im HDF5 ist ein besserer Weg. Aber dann bin ich stucked mit Fehler wie:
accuracy_layer.cpp:34] Check failed:
outer_num_ * inner_num_ == bottom[1]->count()
(50 und 200) Anzahl der Etiketten, die müssen übereinstimmen, Anzahl der Vorhersagen; z.B., wenn label-Achse == 1 ist, und Vorhersage-Form ist (N, C, H, W), label count (Anzahl der Etiketten) müssenN*H*W
, mit integer-Werten in {0, 1, ..., C-1}.
mit im HDF5 erstellt:
f = h5py.File('train.h5', 'w')
f.create_dataset('data', (1200, 128), dtype='f8')
f.create_dataset('label', (1200, 4), dtype='f4')
Mein Netzwerk wird erzeugt durch:
def net(hdf5, batch_size):
n = caffe.NetSpec()
n.data, n.label = L.HDF5Data(batch_size=batch_size, source=hdf5, ntop=2)
n.ip1 = L.InnerProduct(n.data, num_output=50, weight_filler=dict(type='xavier'))
n.relu1 = L.ReLU(n.ip1, in_place=True)
n.ip2 = L.InnerProduct(n.relu1, num_output=50, weight_filler=dict(type='xavier'))
n.relu2 = L.ReLU(n.ip2, in_place=True)
n.ip3 = L.InnerProduct(n.relu1, num_output=4, weight_filler=dict(type='xavier'))
n.accuracy = L.Accuracy(n.ip3, n.label)
n.loss = L.SoftmaxWithLoss(n.ip3, n.label)
return n.to_proto()
with open(PROJECT_HOME + 'auto_train.prototxt', 'w') as f:
f.write(str(net('/home/romulus/code/project/train.h5list', 50)))
with open(PROJECT_HOME + 'auto_test.prototxt', 'w') as f:
f.write(str(net('/home/romulus/code/project/test.h5list', 20)))
Es scheint, ich sollte erhöhen, label-Nummer und die Dinge in einem integer sondern als array, aber wenn ich das mache, caffe klagt Anzahl der Daten und die Beschriftung ist nicht gleich, dann existiert.
So, was ist das richtige format zu füttern multi-label-Daten?
Außerdem bin ich also Fragen, warum niemand einfach nur schreiben das Daten-format wie Sie im HDF5-Karten zu caffe-blobs?
data
von der Art f4
?Wechsel auf die f4-Taste ändert nicht den Fehler.
Wahrscheinlich eine wertvolle Ressource: stackoverflow.com/questions/33112941/...
Danke, dass der Verlust Ebene ist das, was ich brauche.
InformationsquelleAutor Romulus Urakagi Ts'ai | 2015-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort auf diese Frage ist der Titel:
Die im HDF5-Datei sollten zwei datasets in root, mit dem Namen "data" und "label", beziehungsweise. Die Form ist (
data amount
,dimension
). Ich bin mit nur einer dimension data, also ich bin mir nicht sicher, was die Reihenfolge derchannel
,width
, undheight
. Vielleicht ist es egal.dtype
werden sollte, float oder double.Einen Beispiel-code erstellen-Zug-set mit
h5py
ist:Außerdem, die Genauigkeit der layer ist nicht notwendig, einfach zu entfernen, ist es in Ordnung. Nächstes problem ist der Verlust Ebene. Da
SoftmaxWithLoss
hat nur einen Ausgang (index der dimension mit max-Wert), kann es nicht verwendet werden für multi-label-problem. Danke, Adian und Shai, ich findeSigmoidCrossEntropyLoss
ist gut in diesem Fall.Unten ist der volle code-von Daten-Erstellung, Schulung Netzwerk, und erste test-Ergebnis:
h5list Dateien einfach Pfade enthalten, h5-Dateien in jeder Zeile:
und die solver:
Konvergieren graph:
Letzten charge Ergebnis:
Ich denke, dieser code hat noch viele Dinge zu verbessern. Jeder Vorschlag wird sehr geschätzt.
Ja, ich habe nur versucht, binären system. AUF ist 1 und AUS ist 0.
Was Sie caffe-version? Es ist ein Fehler für mich
ImportError: cannot import name layers
Ich derzeit nicht über die Maschine, das sollte die neueste version on Oct 2015.
warum müssen wir laufen test_net 100-fache bei der Berechnung der Genauigkeit? Warum das Ergebnis dieser 100 läuft, auch anders sein?
InformationsquelleAutor Romulus Urakagi Ts'ai
Ihre Richtigkeit Ebene keinen Sinn macht.
Die Art, Genauigkeit Schicht arbeitet: Café Genauigkeit-Schicht erwartet, dass Sie zwei Eingänge
(i) eine vorhergesagte Wahrscheinlichkeit Vektor und
(ii) Boden-Wahrheit entsprechenden scalar integer label.
Die Genauigkeit Schicht als prüft, ob die Wahrscheinlichkeit der vorhergesagten label ist in der Tat die maximale (oder innerhalb
top_k
).Wenn Sie daher zu klassifizieren
C
verschiedenen Klassen, Ihre Eingaben werdenN
-von-C
(woN
ist-batch-Größe) Eingang vorhergesagten Wahrscheinlichkeiten fürN
Proben aus jeder derC
Klassen, undN
labels.Die Art, wie es definiert ist, in Ihrem Netz: Eingabe Genauigkeit Schicht
N
-by-4-Vorhersagen undN
-by-4 Etiketten-das macht keinen Sinn für caffe.Ich habe versucht, EuclideanLoss (ohne Genauigkeit der Schicht), aber es gibt massive nan.
ist es
NaN
für die sehr Anfang? es könnte sein, dass der Verlust ist zu hoch, wodurch Sie Farbverläufe zu "explodieren" werfen Sie Ihr training entfernt. Versuchen Sie,loss_weight
der Verlust Ebene.Ja, es ist
NaN
. Ich werde das ausprobieren, vielen Dank!Durchaus Dinge, die sich unterscheiden, ich poste eine Antwort mit vollständigen codes.
InformationsquelleAutor Shai