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
...
替换嵌套循环
在我的一个项目中,我对 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
...