聊一聊rank-1和rank-5准确度

在我们看来,计算机就是一台严丝合缝、精密运转的机器,严格按照程序员下达的指令工作。虽然产品上线之后经常碰到迷之问题,但我们通常会检讨程序设计得不够完美,而不会认为这是理所当然。因为我们相信只要程序设计严谨,将各种意外情况考虑在内,就会消除这种不确定问题。

然而到了机器学习,特别是深度学习,很多结果都是以概率的形式提供的。就拿图片分类来说,通常模型预测出图片属于每个类别的概率,而不是直接给出一个确定的结果。这就如同天气预报员预报明天的天气:晴天的概率多少多少,下雨的概率多少多少。估计如果这样预报天气,很多人会抓狂。问题是,天气预报说明天是晴天,明天就一定是晴天吗?这其实仍然是一个概率问题。虽然我们掌握了足够的气象资料,天气预报也越来越准确,但是我们依然无法保证每次都是准确的。

既然在深度学习中分类问题是各类别的概率,我们很容易选择一种策略:某个类别的概率最高,我们就认为预测结果属于哪种类别。比如下面这张蛙的图片:

使用CIFAR-10数据集训练出的模型进行推断,各个类别的概率如下:

其中,Frog类别的概率最大,我们就认为这张图片所属的类别为Frog。

计算模型准确度的方法也非常简单:

  • 步骤#1:计算数据集中每个输入图像的类别标签的概率。
  • 步骤#2:确定真实标签是否等于具有最大概率的预测类别标签。
  • 步骤#3:计算步骤#2为真的次数,然后除以总的测试图片数量。

这种度量也称之为rank-1准确度,这也是一种非常直观的度量方式。然而,最近几乎所有在ImageNet数据集上评估的机器

### 行人重识别代码性能指标 #### mAP (Mean Average Precision) mAP 是衡量行人重识别模型整体性能的重要指标之。对于每个查询样本,先计算其 AP(Average Precision),即该查询下不同召回率下的精度均值;再求所有查询样本的 AP 均值得到最终的 mAP。 具体而言,在给定组测试图片作为查询对象时: - 对于每个查询 ID 的每张图,统计在检索列表中按距离从小到大排列前 N 名内出现相同 ID 图片的比例; - 将上述比例累加并除以该查询 ID 下总共有多少张不同的正样本数量得到单次查询对应的 AP; - 所有查询结果的 AP 平均起来就是整个系统的 mAP[^1]。 ```python def compute_ap(ranks, n_pos): ap = 0.0 cnt = 0 for k in range(len(ranks)): if ranks[k]: cnt += 1 ap += float(cnt)/(k+1) return ap/n_pos if n_pos!=0 else 0 def mean_average_precision(distmat, q_pids, g_pids, max_rank=50): num_q, num_g = distmat.shape indices = np.argsort(distmat, axis=1) matches = (g_pids[indices] == q_pids[:,np.newaxis]).astype(np.int32) all_aps = [] for i in range(num_q): y_true = matches[i] y_score = -distmat[i][indices[i]] if not np.any(y_true): continue ranked_indices = np.argsort(y_score)[::-1] y_true = y_true[ranked_indices] n_pos = sum(y_true) ap = compute_ap(y_true, n_pos) all_aps.append(ap) return np.mean(all_aps), all_aps ``` #### Rank-1 准确度 Rank-1 准确度是指在个查询过程中,如果正确匹配的结果位于返回序列的第位,则认为此次查询成功。它反映了模型能否快速定位目标个体的能力。通常用于评估算法是否能够在最短的时间内给出最优解。 为了计算 Rank-1 准确度,可以遍历所有的查询项,并记录每次查询的第个命中位置是否为目标身份。最后统计成功的次数占总数的比例即可得出 Rank-1 准确度[^2]。 ```python def rank_n_accuracy(distmat, q_pids, g_pids, n=1): num_q, num_g = distmat.shape indices = np.argsort(distmat, axis=1) matches = (g_pids[indices] == q_pids[:,np.newaxis]) ret = [] for i in range(n): correct = np.sum(matches[:, :i+1], axis=1).any(axis=-1) acc_k = np.mean(correct) ret.append(acc_k) return ret[n-1] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值