Caffe C++ 在输入层设置数据

Caffe C++ set data in input layer

在我的一个项目中,我对 Caffe 产生了兴趣,更普遍地对深度学习产生了兴趣。几个小时后,我设法在我的电脑上安装了 Caffe。我现在正在努力使我们成为现实。

所以我已经按如下方式加载了网络:

std::string model_file = "/home/CXX/Desktop/caffemodel/deploy.prototxt";
std::string trained_file = "/home/CXX/Desktop/caffemodel/modelWeights.caffemodel";

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

加载的网络和权重不是我的。请在下面找到输入和输出层的结构:

name: "simple_conv-dense"
input: "data"
input_dim: 1
input_dim: 1
input_dim: 250
input_dim: 250
layer {
  name: "conv1"
  bottom: "data"
  type: "Convolution"
  top: "conv1"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }

输入是单个 250*250 深度(在 0 和 1 之间归一化的值)"image"。预处理已经处理好了,我的数据存储在一个Matrix中(个人库,指向std::vector元素的指针),这样你就可以像二维数组一样访问它(data[i][j] )

网络的输出按以下顺序组织:[NbBlob][NbClass][outHeight][outWidth],在我的例子中给出 [1][46][250][250]

我已经编写了检索输出的代码:

Blob<float>* output_layer = net_->output_blobs()[0];
const float* begin = output_layer->cpu_data();
for (int k = 0; k < 46; k++)
    for (int h = 0; h < 250; h++)
        for (int w = 0; w < 250; w++){
            currentprob =  *(begin + ((k * 250 + h) * 250 + w));

此代码已经过检查,通过对像素级 46 class 预测进行求和,显然单个像素的结果为 1。

我的问题是我不知道如何在网络中提供我的数据。我首先通过这种方法检索输入层:

Blob<float>* input_layer = net_->input_blobs()[0];

从调试器中,我知道 input_layer 有一个名为 capacity_ 的属性,它具有预期值(62 500,即 250*250)。

所以这是我的问题:如何将他的数据输入输入层?我已经花了很多时间自己看,但我不知道该去哪里看。

请注意,我没有使用 OpenCV,而且我几乎没有任何深度学习背景(本科生)。

感谢您花时间帮助我。非常欢迎任何类型的帮助(文档、伪代码、代码、解释)。

PS: 使用命名空间 caffe;

编辑:添加了更多输入层信息。错别字

我会尝试直接将数据推送到网络:

Blob<float>* input_layer = net_->input_blobs()[0];
float* input_data = input_layer->mutable_cpu_data();  // get pointer to Blob's data storage
for ( int i=0; i < 250; i++ ) {
    for ( int j=0; j < 250; j++ ) {
        input_data[i*250 + j] = data[i][j];  // I hope I did not filp anything here...
    }
}
net_->forward();  // do forward pass

根据 data 的排列方式,您可以用更优雅的 memcpy...

替换嵌套循环