2016-07-22 75 views
3

我一直在使用Caffe到目前爲止,現在我正嘗試使用C++來熟悉我自己。如何在C++中加載caffe模型進行預測

我所做的是我試圖通過計算功能和加載HDF5層來探索caffe FC層。我已經訓練了模型,並使用下面的代碼可以非常好地蟒蛇:

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 

使用這個Python代碼,我可以檢查和它工作得很好。

我想在C++中編寫代碼來做相同的預測。這條線

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

是有點棘手,我不能做同樣的在C++中:我怎樣才能加載功能集成到數據層在C++:

我的C++代碼到目前爲止是:

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是有用的,但它加載圖像,然後分離渠道。在我的情況下,我有AlexNet的4096-D特徵向量,我想直接在Python代碼中加載。

回答

0

根據其名稱獲取斑指數:

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); 
} 

(當然你也可以通過遍歷blob_names_獲得指數和比較每個項目)。

更改BLOB數據:

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); 

從這點照常繼續。

相關問題