计算机视觉3.4:理解rank-1和rank-5正确率

理解rank-1和rank-5正确率

​ 在学习中,我们经常会遇到 r a n k a c c u r a c y rank accuracy rankaccuracy,这是什么意思呢?

​ 我们举例来解释一下:

假设我们正在评估一个在 C I F A R − 10 CIFAR-10 CIFAR10数据集上训练好的神经网络,输入下图让我们的神经网络来计算出每个类别所对应的概率

image-20211121203907964

返回的结果如下表(左)所示:

image-20211121203854743

​ 类概率最高的是青蛙( 97.3 97.3% 97.3),确实也是正确的结果,如果我们重复此步骤:

  1. 计算数据集中每个输入数据的类概率
  2. 查看 g r o u n d   t r u t h ground\space truth ground truth是否等于预测得到的标签(概率最高)
  3. 记下步骤2正确的个数

​ 我们就得到了 r a n k − 1   a c c u r a c y rank-1\space accuracy rank1 accuracy的概念。

​ 如果我们不仅仅关心第一个预测结果,而是考虑前五名预测结果,则评估过程变成了:

  1. 计算数据集中每个输入数据的类概率
  2. 将预测的类概率降序排列,概率高的类标签处于列表前面
  3. 查看 g r o u n d   t r u t h ground\space truth ground truth是否位于前五个预测标签中
  4. 记下步骤3中正确的个数

R a n k − 5 Rank-5 Rank5 R a n k − 1   a c c u r a c y Rank-1\space accuracy Rank1 accuracy的一个简单拓展,我们考虑网络的前五名预测结果,而不是仅仅考虑第一个预测结果。这对于大型数据集而言是很有意义的。

​ 当处理大型数据集中具有相似特征的很多类的时候,我们可以将 r a n k − 5 rank-5 rank5作为 r a n k − 1 rank-1 rank1的拓展来查看模型的表现如何。

​ 在理想情况下, r a n k − 1 rank-1 rank1准确度会和 r a n k − 5 rank-5 rank5准确度以同样的速率增长,但是在具有挑战性的数据集上,情况往往不是这样。所以我们需要检查 r a n k − 5   a c c u r a c y rank-5\space accuracy rank5 accuracy来确保网络在接下来的回合仍处于学习状态。

​ 有一种情况是, r a n k − 1 rank-1 rank1准确度停滞但 r a n k − 5 rank-5 rank5仍在上升,因为我们的模型还在学习细微的特征。

代码结构:

----deeplearning
|		|----__init__.py
|		|----callbacks
|		|----io
|		|----nn
|		|----utils
|		|		|----__init__.py
|		|		|----ranked.py

打开ranked.py,定义rank5_accuracy.py

import numpy as np


def rank5_accuracy(preds, labels):
    rank1 = 0
    rank5 = 0
    for(p, gt) in zip(preds, labels):
        p = np.argsort(p)[::-1]
        if gt in p[:5]:
            rank5 += 1
        if gt == p[0]:
            rank1 += 1

    rank1 /= float(len(labels))
    rank5 /= float(len(labels))

    return (rank1, rank5)

​ 为了展示如何计算数据集的 r a n k − 1 rank-1 rank1 r a n k − 5   a c c u r a c y rank-5\space accuracy rank5 accuracy,我们使用训练好的卷积神经网络在 I m a g e N e t ImageNet ImageNet上作为特征提取器,基于提取到的特征训练一个逻辑回归分类器。然后生成包含 r a n k − 5 rank-5 rank5的评估报告。

​ 创建名为rank_accuracy.py的文件,写入如下代码,其中model的路径存放的是为计算机视觉3.3 :迁移学习之图像特征向量提取与运用,中训练好的模型,db的路径存放的是为计算机视觉3.3 :迁移学习之图像特征向量提取与运用中方法提取并保存的数据:

from util.ranked import rank5_accuracy
import pickle
import h5py

# 定义提取出的HDF5特征数据库的存储路径
db = "/Users/lingg/PycharmProjects/DLstudy/feature/flower-17/hdf5/feature.hdf5"
# 3.3中训练好的逻辑回归分类器的路径
model = "/Users/lingg/PycharmProjects/DLstudy/model/flower-17.cpickle"

# 加载训练好的模型
print("[INFO] loading pre-trained model...")
model = pickle.loads(open(model, "rb").read())

# 打开HDF5数据库进行读取然后确定训练和测试分割的索引
# 假如这个数据在写入磁盘前已经打乱了
db = h5py.File(db, "r")
i = int(db["labels"].shape[0] * 0.75)

# 在测试集上做预测,并计算出rank-1 和 rank-5正确率
print("[INFO] predicting...")
preds = model.predict_proba(db["features"][i:])
(rank1, rank5) = rank5_accuracy(preds, db["labels"][i:])

# 展示
print("[INFO] rank-1:{:.2f}%".format(rank1 * 100))
print("[INFO] rank-5:{:.2f}%".format(rank5 * 100))

db.close()

运行结果如下:

[INFO] loading pre-trained model...
[INFO] predicting...
[INFO] rank-1:96.64%
[INFO] rank-5:99.66%

进程已结束,退出代码为 0
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值