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

C++ Caffe C++;在输入层中设置数据,c++,qt,neural-network,deep-learning,caffe,C++,Qt,Neural Network,Deep Learning,Caffe,在我的一个项目中,我对Caffe感兴趣,更一般的是对深度学习感兴趣。几个小时后,我设法在我的电脑上安装了Caffe。我现在正试图让我们了解它 因此,我已经加载了网络,如下所示: std::string model_file = "/home/CXX/Desktop/caffemodel/deploy.prototxt"; std::string trained_file = "/home/CXX/Desktop/caffemodel/modelWeights.caffemodel"; Caff

在我的一个项目中,我对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);
输入为单个250*250深度(0和1之间的标准化值)“图像”。预处理已经完成,我的数据存储在一个矩阵中(personnal库,指向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));
Blob*output\u layer=net\u->output\u Blob()[0];
常量浮点*开始=输出层->cpu_数据();
对于(int k=0;k<46;k++)
对于(int h=0;h<250;h++)
对于(int w=0;w<250;w++){
currentprob=*(begin+((k*250+h)*250+w));
该代码已通过对像素方向的46个类预切面求和进行检查,对于单个像素,结果显然为1

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

Blob<float>* input_layer = net_->input_blobs()[0];
Blob*input\u layer=net\u->input\u Blob()[0];
从调试器中,我知道输入层有一个名为capacity的属性,该属性具有预期值(62500,为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
Blob*input\u layer=net\u->input\u Blob()[0];
float*input_data=input_layer->mutable_cpu_data();//获取指向Blob数据存储的指针
对于(int i=0;i<250;i++){
对于(int j=0;j<250;j++){
输入_data[i*250+j]=data[i][j];//我希望我没有在这里输入任何内容。。。
}
}
net->forward();//进行正向传递

根据
数据的排列方式,您可能可以用更优雅的
memcpy
替换嵌套循环。

这里有一个问答。@Scheff感谢您的回答。我以前看到过这个问题,并认为它与我的情况不太接近(我不是从通常的图像格式加载,而是从二进制文件加载)但是我查看了一下,发现MemoryDataLayer是我从可用的输入层中需要的输入层。我更新了CNN输入部分,因为我想我意识到了一些事情(这正是我prototxt的第一行).所有者留下了第一行常规,以便为他的案例定义最合适的输入层,对吗?此外,我无法访问caffe::MemoryDataLayer,只有caffe::MemoryDataParameterI在Google上搜索了一下并绊倒了。此外,还有一个。我再次看到了这篇文章,但不久前,在安装过程中。我将好的,深入了解一下,也许对我来说,更好地理解我应该做什么就足够了。非常感谢您抽出时间。我也成功地使用了
caffe::MemoryDataLayer
,非常感谢。我第一次尝试了这种方法,但
Blob*input\u layer=net\->input\u blobs()[0]
程序崩溃了,我不知道为什么。我目前正在按照上面的建议制作
caffe::MemoryDataLayer
。非常感谢您的建议,它看起来完全适合我的数据(内存中的相邻数据).好的,我明白了,我必须修改prototxt模型,以便在最顶层有一个合适的输入层。你的方法现在可以工作了。坦克太多了。@AntoineMerlet很高兴我能这么做help@AtenaNguyen需要另一个嵌套循环吗
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