2016-07-22 9 views
3

laden Ich habe Caffe auf Python bisher verwendet und jetzt versuche ich C++ zu verwenden, um mich vertraut zu machen.Wie Caffe Modell in C++ für die Vorhersage

Was ich getan habe, ist ich habe versucht, die Caffe FC Schichten durch die Berechnung von Funktionen und Laden durch HDF5-Schicht zu erkunden. Ich habe das Modell trainiert und es funktioniert sehr gut mit Python mit dem folgenden Code:

caffe.set_device(0) 
caffe.set_mode_gpu() 
net = caffe.Net(proto_file, caffe_model, caffe.TEST)  
feats, labels = get_features('test/test.txt') #AlexNet features 
for feature, label in zip(feats, labels): 
    net.blobs['data'].data[...] = feature 
    output = net.forward() 
    output_prob = output['loss'][0] 
    print output_prob.argmax(), ", ", label 

diesen Python-Code verwenden kann ich überprüfen, und es funktioniert sehr gut.

Ich versuche, den Code in C++ zu schreiben, um die gleiche Vorhersage zu machen. Diese Linie

net.blobs['data'].data[...] = feature 

ist etwas schwierig, und ich kann das gleiche in c nicht tun ++: Wie kann ich Funktionen in der Datenschicht in c laden ++:

mein C++ Code so weit ist:

caffe::Caffe::SetDevice(0); 
    caffe::Caffe::set_mode(caffe::Caffe::GPU); 
    boost::shared_ptr<caffe::Net<float> > net_; 
    net_.reset(new caffe::Net<float>(model_file, caffe::TEST)); 
    net_->CopyTrainedLayersFrom(trained_file); 

    std::cout << "LOADED CAFFE MODEL\n"; 
    LOG(INFO) << "Blob size: "<< net_->input_blobs().size(); 

This caffe example ist nützlich, aber es lädt Bild und trennt dann die Kanäle. In meinem Fall habe ich 4096-D Merkmalsvektor von AlexNet, den ich direkt wie im Python-Code laden möchte.

Antwort

0

Holen Sie sich den Blob-Index nach seinem Namen:

const std::vector<std::string>& blob_names_ = net_->blob_names(); 
auto it = std::find(blob_names_.begin(), blob_names_.end(), "data"); 
int index = -1; 
if (it == blob_names_.end()) 
{ 
    // no "data" blob, do error handling 
} 
else 
{ 
    index = std::distance(blob_names_.begin(), it); 
} 

(Natürlich können Sie auch den Index erhalten, indem über blob_names_ iteriert und jedes Element vergleichen).

Ändern der Blob-Daten:

float* feature = your_func_to_get_feature(); // custom this 
caffe::Blob<float>*>& blob_to_set_ = net_->blobs()[index]; 
blob_to_set_->set_cpu_data(feature); 

von diesem Punkt wie gewohnt weiter.