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?
Was ist der 'num_output' der Ebene vor der SoftmaxWithLoss Ebene? – Shai
@Shai num_output war 1, als ich diese Frage gestellt habe – Cassie