Lib Caffe (C++):input_blobs()[0] 在第一次调用后导致底部形状错误

Lib Caffe (C++): input_blobs()[0] causes bottom shape error after first call

我正在尝试使用 Lib Caffe 从图像中提取特征,以便在我的项目中将其用于其他目的。

我的 Caffe 神经网络在第一张图片上工作正常,但在第二张图片上,它抛出以下错误:

Check failed: bottom[0]->shape() == bottom[i]->shape() bottom[0]: 87122736 0 85536896 0 (37632), bottom[1]: 1 3 112 112 (37632)

第一张和第二张图片相同,形状均为 (112 x 112) 3 通道。

代码

Caffe::set_mode(Caffe::CPU);
my_net.reset(new caffe::Net<float>(arch, caffe::TEST));
my_net->CopyTrainedLayersFrom(model);

for(int i=0; i<num_images;i++) {
    Blob<float> *my_blob = my_net->input_blobs()[0]; 

    // accessing blob attributes just for debugging purposes
    // 1 after first call OK, 87122736 at second call (?)
    int batch_size = my_blob->num(); 
    // 3 after first call OK, 0 at second call (?)
    int channels = my_blob->channels(); 
    // 112 after first call OK, 85536896 at second call (?)
    int height = my_blob->height(); 
    // 112 after first call OK, 0 at second call (?)
    int width = my_blob->width(); 

    my_blob->set_cpu_data(images[i]);
    my_net->Forward();

    //delete my_blob; <-- IT WAS CAUSING THE PROBLEM
}

我怎样才能只喂养网络,以便 运行 它可以覆盖下一张图片?如何使 input_blobs()[0] 指向与第一次尝试相同的内存块?可以看到,同一个参数的属性是不同的input_blobs()[0].

已找到解决方案

在以前的 Caffe 版本中,我使用分配一个新的输入 blob,设置它的数据,将它推回一个 boottom,然后按如下方式使用它:

// allocate new input blob
Blob<float> *my_blob = new Blob<float>(1, 1, width, height);
// set its data
feature_blob->set_cpu_data(image[i]);
// push it back to a bottom
std::vector<Blob<float>*> feature_botton;
feature_botton.push_back(feature_blob);
// use the blob forwarding the network
loss=0;
const std::vector<Blob<float>*>& feature_points(
feature_extraction_net->Forward(feature_botton, loss));

// deallocate memory
feature_botton.clear();
delete feature_blob;

问题出在较新版本的 Caffe 上,我不需要释放内存。其实这是问题的根源。我只是不再删除blob了。

解决方案发布在lib的git论坛(solution)