caffe accuracy_layer.cpp 中的排序 paitial_sort

Caffe 中的 accuracy统计,partial_sort取TOP K 个:

这里写图片描述

函数原型有:

  • partial_sort(beg,mid,end)
  • partial_sort(beg,mid,end,comp)

函数作用:
对mid-beg个元素进行排序,也就是说,如果mid-beg等于5,则该函数将有序次序中的最小值元素放在序列中的前5个位置。partial_sort完成之后,从beg到mid(但不包括mid)范围内的元素是有序的,已排序范围内没有元素大于mid之后的元素。未排序元素之间的次序是未指定的。
函数实现原理:
paitical_sort的原理是堆排序!
首先创建一个堆,得到最大值。如果要得到次大值,就将头结点去掉,即调用pop_heap(),此时的头结点就是次大值,可以这样依次得到最大或者最小的几个值!

template< class ExecutionPolicy, class RandomIt, class Compare >
void partial_sort( ExecutionPolicy&& policy, RandomIt first, RandomIt middle, RandomIt last, Compare comp );

堆排序是不稳定的:
比如:3 27 36 27,
如果堆顶3先输出,则,第三层的27(最后一个27)跑到堆顶,然后堆稳定,继续输出堆顶,是刚才那个27,这样说明后面的2先于第二个位置的27输出,不稳定。

在caffe中的取topk
如果有相同的数据,取到的是相同值的最后一个。
举例:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <functional> 
int main() {
  int AA[10] = {1, 3, 4, 5, 7, 5, 4, 7, 3, 1};
  std::vector<int> A(AA, AA + 10);
  std::vector<std::pair<int, int> > bottom_data_vector;
  for (int k = 0; k < 10; ++k) {
    bottom_data_vector.push_back(std::make_pair(AA[k], k));
  }
  std::partial_sort(
    bottom_data_vector.begin(), bottom_data_vector.begin() + 6,
    bottom_data_vector.end(), std::greater<std::pair<int, int> >());
    //bottom_data_vector.end(), std::greater_equal<std::pair<int, int> >());
  for (auto a : bottom_data_vector) {
    std::cout << a.first << " " << a.second << std::endl;
  }
  return 0;
}

结果:
这里写图片描述
这里写图片描述
这里是排序的top6, index为8的的数字7,排在最前面,然后是index为4的数字7排在后。
这里用greater 和 greater_equal 结果是一样的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值