2016-07-14 20 views
1

Ich versuche mein eigenes trainiertes Netzwerk mit meinen eigenen Daten aus C++ zu verwenden. Ich trainierte und testete Netzwerk auf ".jpg" -Daten mit ImageData Ebenen und implementierte dann das grundlegende Caffe-Beispiel "classification.cpp", um Bilder einzeln durch den Speicher zu übertragen. Als Ergebnis muss ich das Problem für 2 Klassen kennen:
1 - Objekt,
2 - Umgebung.Eingangsgrößen, SoftmaxWithLoss und Labels in Caffe verstehen

für die regulären Zwecke Meine Eingangsschicht wie folgt aussieht:

layer { 
    name: "data" 
    top: "data" 
    top: "label" 
    type: "Input" 
    input_param { shape: { dim: 1 dim: 3 dim: 256 dim: 256 }} 
} 

Ausgangsschichten:

layer { 
    name: "fc6" 
    top: "fc6" 
    type: "InnerProduct" 
    bottom: "drop5" 
    inner_product_param { 
     num_output: 2 
     weight_filler { 
      type: "xavier" 
      std: 0.1 
     } 
    } 
} 

layer { 
    name: "prob" 
    top: "prob" 
    type: "SoftmaxWithLoss" 
    bottom: "fc6" 
    bottom: "label" 
} 

layer { 
    name: "accuracy" 
    top: "accuracy" 
    type: "Accuracy" 
    bottom: "fc6" 
    bottom: "label" 
    include { 
     phase: TEST 
    } 
} 

In der Testphase hat sich die Netto-Genauigkeit erreicht = 0,93, aber jetzt in regelmäßigen Gebrauch mit C++ Ich kann ein grundlegendes Konzept nicht verstehen und bekomme einen Fehler beim Parsen des Modells.

Check failure stack trace: 
... 
caffe::SoftmaxWithLossLayer<>::Reshape() 
caffe::Net<>::Init() 
caffe::Net<>::Net() 
... 
Check failed: outer_num_ * inner_num_ == bottom[1]->count() (1 vs. 196608) 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}. 

Ok, 1x3x256x256 = 196608, aber warum brauche ich diese Labelanzahl? ich eine Datei "labels.txt" haben, wie im Beispiel "classification.cpp":

environment 
object 

Warum labels = Klassen!? Was soll ich mit SoftmaxWithLoss und Input-Maßen machen?

Antwort

0

Sie haben nicht die shape für Label definiert, ich nehme an, Sie haben nur ein einzelnes Etikett pro Bild. So

layer { 
    name: "data" 
    top: "data" 
    top: "label" 
    type: "Input" 
    input_param { shape: { dim: 1 dim: 3 dim: 256 dim: 256 } 
       shape: { dim: 1 dim: 1 }} # one label per image 
} 
+0

Danke für die Antwort, aber wenn ich versuche, Ihre Schichtstruktur zu verwenden, erhalte ich: 'Fehler bei der Analyse Text-Format caffe.NetParameter: 51:21: Nicht wiederholt Feld„input_param“wird mehrfach angegeben .' – esterlein

+0

@esterlein bitte meine editieren. – Shai

+1

Danke, @Shai, es funktioniert, sieht aus wie ich beginne, folgende Mismatch-Problem zu lösen) – esterlein