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,设置其数据,将其推送回引导,然后将其用作波纹管:
// 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,我不需要释放内存。实际上这是问题的根源。我只是不再删除斑点了。
该解决方案发布在 lib 的 git 论坛中(解决方案)
相关文章:
- C++模板类 - 继承调用错误的函数
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 使用 std::find 时没有匹配的函数调用错误
- 使用成员初始值设定项列表时没有匹配的函数调用错误
- C++调用错误签名的函数
- C++ 类成员调用错误 C3861
- C bool表达式作为函数参数调用错误的超载
- C ++尝试访问映射中的元素会给我一个不匹配的函数调用错误
- 当提供巨大的输入时,中止在堆栈操作程序中调用错误
- C++类静态成员函数调用错误
- 如何调查随机安卓原生函数调用错误?
- 引发实例后终止调用 - C++错误
- 如何修复传递参数时调用错误函数的主函数?(C++)
- 没有用于调用错误的匹配函数.将字符串推送到向量中
- 从括号内的initializer_list构造时,将调用错误的过载
- 为什么初始值设定项列表中的元素数会导致不明确的调用错误
- VC 15调用错误的复制构造函数以捕获lambda
- 在 C++ 中没有针对调用错误的匹配函数
- C++:函数调用错误:标识符"name"未定义,如果已定义?
- 为什么 GCC 在显式指定模板参数时会产生奇怪的错误并尝试调用错误的方法?