caffe输出每次测试结果

caffe如何在每次测试过程中输出具体每次预测是什么类别,不仅仅就一个accuracy,想对每次测试错误的图片进行适当观察。
已邀请:

ruirui_ICT - 听大大们说,要“左手代码,右手公式”,喵~

赞同来自: xinmiao 李扬 hahaha lady_he

其实最后test输出是accuracy的结果是因为test网络的最后一层是accuracy层,如果把这一层去掉,让最后一层变成fc8层,自然就会输出这一层的概率值,然后再利用这些概率值进行一些自己的处理。
 
当然我比较推荐的办法是直接根据自己的需求修改accuracy层的代码,其实也很简单,主要看一下accuracy_layer.cpp的forward_cpu函数就可以了,计算top-k的代码主要是下面这段
      // Top-k accuracy
std::vector<std::pair<Dtype, int> > bottom_data_vector;
for (int k = 0; k < num_labels; ++k) {
bottom_data_vector.push_back(std::make_pair(
bottom_data[i * dim + k * inner_num_ + j], k));
}
std::partial_sort(
bottom_data_vector.begin(), bottom_data_vector.begin() + top_k_,
bottom_data_vector.end(), std::greater<std::pair<Dtype, int> >());
// check if true label is in top k predictions
for (int k = 0; k < top_k_; k++) {
if (bottom_data_vector[k].second == label_value) {
++accuracy;
break;
}
}
其实主要就是对上一层(比如fc8)结果排序,然后和label比较了一下,看看对不对。你可以根据自己的需要,直接把排序后的结果label输出出来什么的。

shuokay

赞同来自: xinmiao hahaha

拿到最后一层的数据,然后自己处理,之前写过一个,tag v0.9999的,最新的caffe代码可能会不兼容了,不过,思路是一样的。
这里是使用了argmax层的,如果你不用argmax layer的话,也是取出最后一层,然后自己找到max的类~
const vector < Blob < float >*>& result = caffe_net.Forward(dummy_blob_input_vec);
const float* argmaxs=result[0]->cpu_data();
for(int i=0;i<result[0]->num();++i){
LOG(INFO)<<" Image: "<< i << " class:" << argmaxs[i];
}[/i]

要回复问题请先登录注册