2016-07-22 8 views
3

私はCaffeをPythonで使っていますが、今はC++を使って自分自身を習得しようとしています。C++での予測のためのCaffeモデルの読み込み方法

私がやったことは、機能を計算しHDF5レイヤーをロードすることで、Caffe FCレイヤーを探索しようとしたことです。私はモデルを訓練してきたし、それが次のコードを使用してのpythonと非常によく動作します:

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は便利ですが、イメージをロードしてチャネルを分割します。私の場合、私はPythonコードのように直接ロードしたいAlexNetの4096-Dの特徴ベクトルを持っています。

答えて

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

は、いつものように、この時点から続けます。

関連する問題