2

Ich bin ein Netzwerk feinduning. In einem bestimmten Fall möchte ich es für die Regression verwenden, was funktioniert. In einem anderen Fall möchte ich es für die Klassifizierung verwenden.Caffe-Klassifizierung Etiketten in HDF5

Für beide Fälle habe ich eine HDF5-Datei, mit einem Etikett. Bei Regression ist dies nur ein 1-mal-1-numpy-Array, das einen Gleitkommawert enthält. Ich dachte, ich könnte das gleiche Label für die Klassifizierung verwenden, nachdem ich meine EuclideanLoss-Schicht zu SoftmaxLoss gewechselt habe. Aber dann bekomme ich einen negativen Verlust als so:

Können Sie erklären, ob und was schief geht? Ich sehe, dass der Trainingsverlust etwa 40 ist (was immer noch schrecklich ist), aber trainiert das Netzwerk noch? Der negative Verlust wird immer negativer.

UPDATE
Nach Shai's comment und answer lesen, ich habe folgende Änderungen vorgenommen:
- ich num_output meiner letzten vollständig verbundenen Schicht 6 aus (1 verwendet werden) haben 6 Etiketten wie ich.
- ich jetzt eine One-Hot-Vektor erstellen und in mein HDF5 Datensatz als ein Etikett wie folgt über

f['label'] = numpy.array([1, 0, 0, 0, 0, 0])   

Der Versuch, mein Netzwerk jetzt laufen kehrt

Check failed: hdf_blobs_[i]->shape(0) == num (6 vs. 1)  

Nach einigen Recherchen online, ich hat den Vektor zu einem 1x6-Vektor umgeformt. Dies führt zu dem folgenden Fehler:

Check failed: outer_num_ * inner_num_ == bottom[1]->count() (40 vs. 240) 
    Number of labels must match number of predictions; e.g., if softmax axis == 1 
    and prediction shape is (N, C, H, W), label count (number of labels) 
    must be N*H*W, with integer values in {0, 1, ..., C-1}. 

Meine Idee ist ein Etikett pro Datensatz (Bild) hinzufügen und in meinem train.prototxt ich erstellen Chargen. Sollte dies nicht die richtige Batchgröße erzeugen?

+0

Was ist der 'num_output' der Ebene vor der SoftmaxWithLoss Ebene? – Shai

+0

@Shai num_output war 1, als ich diese Frage gestellt habe – Cassie

Antwort

2

Da Sie von Regression zur Klassifikation bewegt, müssen Sie die Ausgabe nicht ein Skalar mit "label" zu vergleichen, sondern eher eine Wahrscheinlichkeit Vektor der Länge num-Etiketten mit der diskreten Klasse "label" zu vergleichen. Sie müssen den num_output Parameter der Ebene vor "SoftmaxWithLoss" von 1 zu num-labels ändern.

Ich glaube, dass Sie derzeit auf nicht initialisierten Speicher zugreifen und ich würde erwarten, dass Caffe früher oder später in diesem Fall abstürzt.

aktualisieren:
Sie haben zwei Änderungen: num_output 1 -> 6 und Sie verändert auch die Eingabe label von einem Skalar-Vektor.
Die erste Änderung war die einzige, die Sie für die Verwendung von "SoftmaxWithLossLayer" benötigten.
Ändern Sie nicht label von einem Skalar zu einem "Hot-Vektor".

Warum?
Da "SoftmaxWithLoss" grundsätzlich mit dem Sie Ausgang 6-Vektor-Vorhersage sieht, interpretieren die Grund Wahrheit label als Index und sieht -log(p[label]): Je näher p[label] ist zu 1 (dh Sie hohe Wahrscheinlichkeit für die erwartete Klasse vorhergesagt) die untere der Verlust. Machen Sie eine Vorhersage p[label] nahe bei Null (d. H. Sie haben eine geringe Wahrscheinlichkeit für die erwartete Klasse falsch vorhergesagt), dann wächst der Verlust schnell.


einen „hot-Vektor“, wie Ground-Truth-Eingang label kann zu mehreren Kategorien Klassifikation gibt Verwendung Anstieg (nicht scheint nicht wie die Aufgabe, die Sie hier versuchen zu lösen). Sie können this SO thread für diesen speziellen Fall relevant finden.

+0

Danke für die Vorschläge! Merkwürdigerweise stürzte Caffe nicht ab. Ich habe meine Frage dahingehend aktualisiert, wie ich Ihre Vorschläge und die Ergebnisse verstanden habe! – Cassie

+0

@ user4039874 Bitte beachten Sie mein Update. – Shai

+0

Danke! Mein Programm verhält sich mehr wie ich erwartet habe! Mein Iterationsverlust ist jedoch immer noch negativ. Irgendwelche Ideen, was das verursacht? – Cassie