Top-K准确率
Top-K准确率就是用来计算预测结果中概率最大的前K个结果包含正确标签的占比。换句话说,平常我们所说的准确率其实就是Top-1准确率。下面我们还是通过一个例子来进行说明。
假如现在有一个用于手写体识别的分类器(10分类),你现在将一张正确标签为3
的图片输入到分类器中且得到了如下所示的一个概率分布:
l
o
g
i
t
s
=
[
0.1
,
0.05
,
0.1
,
0.2
,
0.35
,
0.01
,
0.03
,
0.05
,
0.01
,
0.1
]
logits = [0.1,0.05,0.1,0.2,0.35,0.01,0.03,0.05,0.01,0.1]
logits=[0.1,0.05,0.1,0.2,0.35,0.01,0.03,0.05,0.01,0.1]
显然,根据预测的结果来看,其最大概率0.35
所对应的标签为4,这也就代表着如果按照以往的标准(Top-1准确率)来看,分类器对于这张图片的预测结果就是错误的。但如果我们以Top-2的标准来看的话,分类器对于这个图片的预测结果就是正确的,因为logits中概率值最大的前两个中包含有真实的标签。也就是说,虽然0.35对应的标签是错的,但是排名第二的概率值
所对应的标签是正确的,所以我们在计算Top-2准确率的时候也将上述结果当作是预测正确的。
Top-K准确率的代码实现
#计算 Top-k 准确率
class AccTopk():
#传入-1,1
def __init__(self,background_classes,k):
self.background_classes = background_classes
self.k = k
self.cnt = 0
self.top5_correct = 0
def reset(self):
self.cnt = 0
self.top5_correct = 0
def update(self,predict,target):
#将 predict 转换为概率最大的类别索引
predict = predict.argmax(1)
#转换格式
predict,target = converter(predict),converter(target)
#增加计数,计量样本数
self.cnt += len(predict)
#target是否为背景类别
background_idx = (target == self.background_classes)
# self.top5_correct += np.sum(predict[background_idx] == target[background_idx])
#创建一个布尔型数组,表示哪些样本不属于背景类别
not_background_idx = np.logical_not(background_idx)
#计算非背景类别样本的预测值与目标值之差的绝对值,看是否小于self.k,生成布尔数组
#可得符合条件的样本数量,将符合条件的样本数量累加到 self.top5_correct 中
self.top5_correct += np.sum(np.absolute(predict[not_background_idx]-target[not_background_idx])<self.k)
def get(self):
return self.top5_correct * 1.0 / self.cnt
来源UFDLv2模型代码。
多标签分类准确率的代码实现
class MultiLabelAcc():
def __init__(self):
self.cnt = 0
self.correct = 0
def reset(self):
self.cnt = 0
self.correct = 0
def update(self,predict,target):
#获取最大概率对应索引
predict = predict.argmax(1)
#转换格式
predict,target = converter(predict),converter(target)
self.cnt += len(predict)
#预测正确则计数
self.correct += np.sum(predict==target)
def get_acc(self):
return self.correct * 1.0 / self.cnt
def get(self):
return self.get_acc()