如何在c ++中加载caffe模型进行预测

时间:2016-07-22 14:35:31

标签: c++ machine-learning neural-network deep-learning caffe

到目前为止,我一直在Python上使用Caffe,现在我正在尝试使用C ++来熟悉自己。

我所做的是通过计算功能和通过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很有用,但它会加载图片然后分隔通道。在我的例子中,我有来自AlexNet的4096-D特征向量,我想像Python代码一样直接加载。

1 个答案:

答案 0 :(得分:0)

根据名称获取blob索引:

required

(当然你也可以通过迭代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数据:

blob_names_

像往常一样从这一点继续。