在咱们看来,计算机就是一台严丝合缝、精密运转的机器,严格按照程序员下达的指令工做。虽然产品上线以后常常碰到迷之问题,但咱们一般会反省程序设计得不够完美,而不会认为这是理所固然。由于咱们相信只要程序设计严谨,将各类意外状况考虑在内,就会消除这种不肯定问题。git
然而到了机器学习,特别是深度学习,不少结果都是以几率的形式提供的。就拿图片分类来讲,一般模型预测出图片属于每一个类别的几率,而不是直接给出一个肯定的结果。这就如同天气预报员预报明天的天气:晴天的几率多少多少,下雨的几率多少多少。估计若是这样预报天气,不少人会抓狂。问题是,天气预报说明天是晴天,明天就必定是晴天吗?这其实仍然是一个几率问题。虽然咱们掌握了足够的气象资料,天气预报也愈来愈准确,可是咱们依然没法保证每次都是准确的。程序员
既然在深度学习中分类问题是各种别的几率,咱们很容易选择一种策略:某个类别的几率最高,咱们就认为预测结果属于哪一种类别。好比下面这张蛙的图片:github
使用CIFAR-10数据集训练出的模型进行推断,各个类别的几率以下:bash
其中,Frog类别的几率最大,咱们就认为这张图片所属的类别为Frog。微信
计算模型准确度的方法也很是简单:网络
这种度量也称之为rank-1准确度,这也是一种很是直观的度量方式。然而,最近几乎全部在ImageNet数据集上评估的机器学习模型的论文都不只给出了rank-1准确度,还给出了rank-5准确度。机器学习
顾名思义,rank-5准确度选取5个最大几率的类别,只要这5个类别中的一个和真实标签相同,该预测结果就为真。rank-5准确度的计算方法以下:ide
rank-1和rank-5的代码实现也很是简单:oop
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]
if gt in p[:5]:
rank5 += 1
if gt == p[0]:
rank1 +=1
# compute the final rank-1 and rank-5 accuracies
rank1 /= float(len(labels))
rank5 /= float(len(labels))
return (rank1, rank5)
复制代码
有朋友可能会以为,这个机器学习也太不靠谱了吧!不能给出一个精确的结果也就算了,还给出5个模凌两可的答案。在CIFAR-10这样的小数据集上,由于总的类别不多,若是还统计rank-5准确率,的确有点傻,可是考虑到ImageNet这样超大规模的数据集,其类别有成千上万个,特别是某些较小的类目,好比以下两张图片:post
普通人也很难分辨出其类别不一样。因此在某些大型图片分类模型任务中,rank-5准确率能够提供一个对rank-1准确率的一个补充。
理想状况下,rank-1准确度将与rank-5准确度同步增长,可是在具备挑战性的数据集上,状况并不是老是如此。所以,咱们还会检查rank-5的准确度,以确保咱们的网络在rank-1准确度停滞不前时仍然在“学习”。
以上实例均有完整的代码,点击阅读原文,跳转到我在github上建的示例代码。
另外,我在阅读《Deep Learning for Computer Vision with Python》这本书,在微信公众号后台回复“计算机视觉”关键字,能够免费下载这本书的电子版。