下载地址
链接:https://pan.baidu.com/s/1hqtBQf6jRJINx4AgB8S2Tw
提取码:zxkt
第二卷 第三章 理解rank-1&rank-5精度
在讨论高级深度学习主题(例如迁移学习)之前,让我们先退后一步,讨论1级、5级和N级准确率的概念。在阅读深度学习文献时,尤其是在计算机视觉和图像分类领域,您可能会遇到排名准确性的概念。例如,几乎所有介绍在ImageNet数据集上评估的机器学习方法的论文都根据1级和5级准确度展示了他们的结果(我们将找出为什么1级和5级准确度都在后面报告)在这一章当中)。
1级和5级准确率到底是什么?它们与传统的准确度(即精度)有何不同?在本章中,我们将讨论排序准确率,学习如何实现它,然后将其应用于在Flowers-17和CALTECH-101数据集上训练的机器学习模型。
1、排名准确率
排名准确率最好用一个例子来解释。假设我们正在评估在CIFAR-10数据集上训练的神经网络,其中包括十个类别:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。给定以下输入图像(图左),我们要求神经网络计算每个类标签的概率——然后神经网络返回表(左)中列出的类标签概率。
概率最大的类标签是青蛙(97.3%),这确实是正确的预测。如果我们重复这个过程:
1.第1步:计算数据集中每个输入图像的类标签概率。
2.第2步:确定真实标签是否等于具有最大概率的预测类标签。
3.第3步:计算第2步为真的次数。
我们将得到1级准确率。因此,Rank-1准确度是最高预测与真实标签匹配的预测百分比——这是我们用来计算的“标准”准确度类型:取正确预测的总数,然后除以数据集中的数据点数。
然后我们可以将这个概念扩展到5级精度。我们不仅关心排名第一的预测,还关心排名前5的预测。我们的评估过程现在变成:
1.第1步:计算数据集中每个输入图像的类标签概率。
2.第2步:按降序对预测的类别标签概率进行排序,以便将概率较高的标签放在列表的前面。
3.第3步:确定第2步的前5个预测标签中是否存在真实标签。
4.第4步:计算第3步为真的次数。
Rank-5只是rank-1准确率的扩展:我们将考虑来自网络的前5个预测,而不是只关心来自分类器的#1预测。例如,让我们再次考虑将基于任意神经网络归入CIFAR-10类别的输入图像(图右)。通过我们的网络后,我们获得了表(右)中详述的类标签概率。
我们的形象显然是一辆汽车;然而,我们的网络将卡车报告为最高预测——这将被视为对1级准确度的错误预测。但是如果我们检查网络的top-5预测,我们会看到汽车实际上是第二个预测,这在计算rank-5准确率时是准确的。这种方法也可以很容易地扩展到任意rank-N精度;然而,我们通常只计算1级和5级精度——这就提出了一个问题,为什么要计算5级精度呢?
对于CIFAR-10数据集,计算5级精度有点傻,但对于大型、具有挑战性的数据集,尤其是细粒度分类,查看给定CNN的前5名预测通常很有帮助。也许我们可以在Szegedy等人中找到我们为什么计算rank-1和rank-5精度的最好例子。我们可以在左边看到一只西伯利亚哈士奇犬和一只爱斯基摩犬在右侧(图)。大多数人无法识别这两种动物之间的区别。然而,这两个类都是ImageNet数据集中的有效标签。
在处理包含许多具有相似特征的类标签的大型数据集时,我们经常检查5级精度作为1级精度的扩展,以了解我们的网络的性能。在理想情况下,我们的1级准确率会以与5级准确率相同的速度增加,但在具有挑战性的数据集上,情况并非总是如此。
因此,我们还检查了5级的准确率,以确保我们的网络在以后的时代仍在“学习”。可能会出现这样的情况,即1级准确度在训练结束时停滞不前,但5级准确度会随着我们的网络学习更多判别特征而继续提高(但判别力不足以超过排名第一的预测)。最后,根据图像分类挑战(ImageNet是典型示例),您需要同时报告1级和5级精度。
(1)计算Rank-1和Rank-5
计算rank-1和rank-5的精度可以通过构建一个简单的实用函数来完成。在我们的pyimagesearch模块中,我们将通过添加一个名为rating.py的文件将此功能添加到utils子模块:
ranked.py,参考代码如下:
# import the necessary packages
import numpy as np
def rank5_accuracy(preds, labels):
# initialize the rank-1 and rank-5 accuracies
rank1 = 0
rank5 = 0
# loop over the predictions and ground-truth labels
for (p, gt) in zip(preds, labels):
# sort the probabilities by their index in descending
# order so that the more confident guesses are at the
# front of the list
p = np.argsort(p)[::-1]
# check if the ground-truth label is in the top-5
# predictions
if gt in p[:5]:
rank5 += 1
# check to see if the ground-truth is the #1 prediction
if gt == p[0]:
rank1 += 1
(2)实现Rank
为了演示如何计算数据集的rank-1和rank-5精度,让我们回到第2章,我们在ImageNet数据集上使用预训练的卷积神经网络作为特征提取器。基于这些提取的特征,我们对数据训练了逻辑回归分类器并评估了模型。我们现在将扩展我们的准确性报告以包括5级准确性。
当我们为逻辑回归模型计算1级和5级准确度时,请记住,任何机器学习、神经网络或深度学习模型都可以计算1级和5级准确度——这很常见在深度学习社区之外遇到这两个指标。说了这么多,打开一个新文件,将其命名为rank_accuracy.py,然后插入以下代码:
# import the necessary packages
from ranked import rank5_accuracy
import argparse
import pickle
import h5py
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--db", required=True,
help="path HDF5 database")
ap.add_argument("-m", "--model", required=True,
help="path to pre-trained model")
args = vars(ap.parse_args())
# load the pre-trained model
print("[INFO] loading pre-trained model...")
model = pickle.loads(open(args["model"], "rb").read())
# open the HDF5 database for reading then determine the index of
# the training and testing split, provided that this data was
# already shuffled *prior* to writing it to disk
db = h5py.File(args["db"], "r")
i = int(db["labels"].shape[0] * 0.75)
# make predictions on the testing set then compute the rank-1
# and rank-5 accuracies
print("[INFO] predicting...")
preds = model.predict_proba(db["features"][i:])
(rank1, rank5) = rank5_accuracy(preds, db["labels"][i:])
# display the rank-1 and rank-5 accuracies
print("[INFO] rank-1: {:.2f}%".format(rank1 * 100))
print("[INFO] rank-5: {:.2f}%".format(rank5 * 100))
# close the database
db.close()
(3)在Flowers-17数据集上计算Rank
计算Flowers-17数据集的rank-1和rank-5准确度:
在Flowers-17数据集上,我们使用对从VGG16架构中提取的特征进行训练的逻辑回归分类器获得了92.06%的1级准确率。检查5级准确率,我们发现我们的分类器几乎是完美的,获得了99.41%的5级准确率。
(4)在CALTECH-101数据集上计算Rank
让我们再试试另一个例子,这个在更大的CALTECH-101数据集上:
在这里,我们获得了95.58%的1级准确率和99.45%的5级准确率,与之前难以突破60%分类准确率的计算机视觉和机器学习技术相比,这是一个重大改进。
2、小结
在本章中,我们回顾了1级和5级准确率的概念。Rank-1准确率是我们的真实标签以最大概率等于我们的类标签的次数。Rank-5准确度在rank-1准确度的基础上扩展,使其更加“宽松”——这里我们计算rank-5准确度作为我们的真实标签出现在前5个预测类标签中的次数最大的概率。
我们通常在大型、具有挑战性的数据集(例如ImageNet)上报告5级准确率,在这种情况下,即使是人类通常也很难正确标记图像。在这种情况下,如果地面实况标签仅存在于其前5个预测中,我们将认为我们模型的预测是“正确的”。正如我们在StarterBundle的第9章中讨论的那样,一个真正泛化能力强的网络将在其top-5概率中产生上下文相似的预测。
最后,请记住,1级和5级准确率并非特定于深度学习和图像分类——您也经常会在其他分类任务中看到这些指标。