Top-K准确率代码实现


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()
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pytorch实现Top1准确率和Top5准确率需要通过计算模型在测试集上的预测结果与真实标签的匹配情况来实现。具体步骤如下: 1. 首先,使用模型对测试集中的样本进行预测,得到每个样本的预测结果。 2. 对于每个样本,将预测结果按照概率从高到低排序,得到一个概率列表。 3. 获取真实标签在概率列表中的位置,如果真实标签在概率列表中的第一个位置,则表示该样本的Top1准确率为1,否则Top1准确率为0。 4. 获取真实标签在概率列表中前5个位置的个数,如果个数大于等于1,则表示该样本的Top5准确率为1,否则Top5准确率为0。 5. 对于所有测试集样本的Top1准确率和Top5准确率进行累加计算,最终得到平均Top1准确率和Top5准确率。 以下是一个示例代码实现: ```python import torch def accuracy(output, target, topk=(1, 5)): """计算模型的Top-K准确率""" with torch.no_grad(): maxk = max(topk) batch_size = target.size(0) _, pred = output.topk(maxk, 1, True, True) pred = pred.t() correct = pred.eq(target.view(1, -1).expand_as(pred)) res = [] for k in topk: correct_k = correct[:k].reshape(-1).float().sum(0, keepdim=True) res.append(correct_k.mul_(100.0 / batch_size)) return res # 计算模型在测试集上的Top1准确率和Top5准确率 model.eval() top1_acc = 0.0 top5_acc = 0.0 total = 0 for data in test_loader: images, labels = data[0].to(device), data[1].to(device) outputs = model(images) acc1, acc5 = accuracy(outputs, labels, topk=(1, 5)) top1_acc += acc1.item() * images.size(0) top5_acc += acc5.item() * images.size(0) total += images.size(0) top1_acc /= total top5_acc /= total print(f"Top1 Accuracy: {top1_acc:.2f}%") print(f"Top5 Accuracy: {top5_acc:.2f}%") ``` 其中,`accuracy`函数用于计算模型的Top-K准确率,`output`是模型的预测输出,`target`是真实标签,`topk`是一个元组,表示要计算的Top-K值,默认为(1, 5)。在计算Top-K准确率时,会将预测输出按照概率从高到低排序,然后获取前K个预测值与真实标签的匹配情况,最终返回一个列表,包含Top-K准确率的值。在计算测试集上的Top1准确率和Top5准确率时,需要将模型设置为评估模式(`model.eval()`),然后对测试集中的每个样本进行预测,并累加Top1准确率和Top5准确率的值,最终除以测试集样本的总数,得到平均Top1准确率和Top5准确率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值