理解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 CIFAR−10数据集上训练好的神经网络,输入下图让我们的神经网络来计算出每个类别所对应的概率
返回的结果如下表(左)所示:
类概率最高的是青蛙( 97.3 97.3% 97.3),确实也是正确的结果,如果我们重复此步骤:
- 计算数据集中每个输入数据的类概率
- 查看 g r o u n d t r u t h ground\space truth ground truth是否等于预测得到的标签(概率最高)
- 记下步骤2正确的个数
我们就得到了 r a n k − 1 a c c u r a c y rank-1\space accuracy rank−1 accuracy的概念。
如果我们不仅仅关心第一个预测结果,而是考虑前五名预测结果,则评估过程变成了:
- 计算数据集中每个输入数据的类概率
- 将预测的类概率降序排列,概率高的类标签处于列表前面
- 查看 g r o u n d t r u t h ground\space truth ground truth是否位于前五个预测标签中
- 记下步骤3中正确的个数
R a n k − 5 Rank-5 Rank−5是 R a n k − 1 a c c u r a c y Rank-1\space accuracy Rank−1 accuracy的一个简单拓展,我们考虑网络的前五名预测结果,而不是仅仅考虑第一个预测结果。这对于大型数据集而言是很有意义的。
当处理大型数据集中具有相似特征的很多类的时候,我们可以将 r a n k − 5 rank-5 rank−5作为 r a n k − 1 rank-1 rank−1的拓展来查看模型的表现如何。
在理想情况下, r a n k − 1 rank-1 rank−1准确度会和 r a n k − 5 rank-5 rank−5准确度以同样的速率增长,但是在具有挑战性的数据集上,情况往往不是这样。所以我们需要检查 r a n k − 5 a c c u r a c y rank-5\space accuracy rank−5 accuracy来确保网络在接下来的回合仍处于学习状态。
有一种情况是, r a n k − 1 rank-1 rank−1准确度停滞但 r a n k − 5 rank-5 rank−5仍在上升,因为我们的模型还在学习细微的特征。
代码结构:
----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 rank−1和 r a n k − 5 a c c u r a c y rank-5\space accuracy rank−5 accuracy,我们使用训练好的卷积神经网络在 I m a g e N e t ImageNet ImageNet上作为特征提取器,基于提取到的特征训练一个逻辑回归分类器。然后生成包含 r a n k − 5 rank-5 rank−5的评估报告。
创建名为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