Test eines Regressionsnetzwerks in caffe

Ich versuche, mit Alexnet Objekte in einem Bild zu zählen.

Ich habe derzeit Bilder mit 1, 2, 3 oder 4 Objekten pro Bild. Für die erste Überprüfung habe ich 10 Bilder pro Klasse. Zum Beispiel im Trainingsset habe ich:

image  label
image1  1
image2  1
image3  1
...
image39 4
image40 4

Ich habe imagenet create script verwendet, um eine lmdb-Datei für dieses Dataset zu erstellen. Welches erfolgreich konvertiert meine Reihe von Bildern zu lmdb. Alexnet wird als Beispiel in ein Regressionsmodell konvertiert, um die Anzahl der Objekte im Bild zu ermitteln, indem EucledeanLosslayer anstelle von Softmax Layer eingeführt wird. Wie von vielen vorgeschlagen. Der Rest des Netzwerks ist derselbe.

Wenn ich das Modell jedoch ausführte, erhielt ich während der Testphase (siehe unten) nur Nullen als Ausgabe. Es hat nichts gelernt. Der Trainingsverlust nahm jedoch bei jeder Iteration kontinuierlich ab.

Ich verstehe nicht, welche Fehler ich gemacht habe. Kann mich jemand anleiten, warum die vorhergesagten Werte immer 0 sind? Und wie kann ich die Regressionswerte in der Testphase überprüfen, um zu überprüfen, wie viele Proben korrekt sind und wie hoch der Wert für jedes meiner Bilder ist?

Das vorhergesagte und das tatsächliche Etikett des Testdatensatzes werden wie folgt angegeben:

I0928 17:52:45.585160 18302 solver.cpp:243] Iteration 1880, loss = 0.60498
I0928 17:52:45.585212 18302 solver.cpp:259]     Train net output #0: loss = 0.60498 (* 1 = 0.60498 loss)
I0928 17:52:45.585225 18302 solver.cpp:592] Iteration 1880, lr = 1e-06
I0928 17:52:48.397922 18302 solver.cpp:347] Iteration 1900, Testing net (#0)
I0928 17:52:48.499543 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 1
I0928 17:52:48.499641 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 2
I0928 17:52:48.499660 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 3
I0928 17:52:48.499681 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 4
...

Hinweis: Ich habe auch Dateien im hdf5-Format erstellt, um schwebende Bezeichnungen zu erhalten, d. H. 1.0, 2.0, 3.0 und 4.0. Wenn ich jedoch die Datenebene auf den HDF5-Typ ändere, kann ich das Bild nicht für die Datenerweiterung zuschneiden, da dies in alexnet mit der lmdb-Ebene sowie der Normalisierung erfolgt. Ich habe das Skript verwendet, das auf "https: //github.com/nikogamulin/caffe-utils/blob/master/hdf5/demo. "für hdf5-Daten und befolgte seine Schritte zur Verwendung in meinem Modell.

Ich habe die letzten Ebenen als solche aktualisiert:

layer {
   name: "fc8reg"
   type: "InnerProduct"
   bottom: "fc7"
   top: "fc8reg"
   param {
    lr_mult: 1
    decay_mult: 1
   }
   param {
     lr_mult: 2
     decay_mult: 0
   }
   inner_product_param {
   num_output: 1
   weight_filler {
       type: "gaussian"
       std: 0.01
   }
   bias_filler {
       type: "constant"
       value: 0
   }
   }
 }
 layer {
   name: "accuracy"
   type: "Accuracy"
   bottom: "fc8reg"
   bottom: "label"
   top: "accuracy"
   include {
     phase: TEST
   }
 }
 layer {
   name: "loss"
   type: "EuclideanLoss"
   bottom: "fc8reg"
   bottom: "label"
   top: "loss"
 }

Antworten auf die Frage(4)

Ihre Antwort auf die Frage