tensorflow之tensor排序和 top accuracy

如何最tensor进行排序

shuffle打乱顺序,tf.sort(a,dirrection='DESCENDING')降序

tf.argsort()最大值返回的下标

gather根据索引提取数据

 

多维进行排序 

 

top_k:最大的前几个值 

res.indices获取索引

res.value获取值

 

 top accuracy

那Top-1 Accuracy和Top-5 Accuracy是指什么呢?区别在哪呢?我们知道ImageNet有大概1000个分类,而模型预测某张图片时,会给出1000个按概率从高到低的类别排名,

所谓的Top-1 Accuracy是指排名第一的类别与实际结果相符的准确率,而Top-5 Accuracy是指排名前五的类别包含实际结果的准确率。

举个列子

数字0~9的预测概率分布为: [[0.301023   0.8182187  0.71007144 0.80164504 0.7268218  0.58599055 0.19250274 0.9076816  0.8101771  0.49439466]]
实际结果为数字: [1]
实际结果是否in top 1:  [False]
实际结果是否in top 5:  [ True]

从结果上看,output中排名最高的值为0.9076816,其对应的数字为7,而实际数字为1,故不在Top1,而数字1对应的值为0.8182187,排名第二,故在Top5内(7是下标)

 

 

top_k最大值排序输出

transpose转置

broadcast_to:改变维度 

 

如何计算top_k

为了找到输入的张量的最后的一个维度的最大的k个值和它的下标!

如果输入的是一个向量,也就是rank=1,找到最大的k个数在这个向量,则输出最大的k个数字和最大的这k个数字的下标。如果输入的张量是一个更高rank的矩阵,那么我们只要找到每一行的最大的k个数字,以及他们的下标。如果两个元素相同,那么低一点的下标先出现。

 这个函数的作用是返回 input 中每行最大的 k 个数,并且返回它们所在位置的索引

 

小demo: 

import tensorflow as tf
import numpy as np
import os

os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
tf.random.set_seed(2467)

def accurary(output,target,topk=(1,)):
    maxk =max(topk)
    batch_size = target.shape[0]

    pred = tf.math.top_k(output,maxk).indices
    pred = tf.transpose(pred,perm=[1,0])
    target_ = tf.broadcast_to(target,pred.shape)
    #[10,b]
    correct = tf.equal(pred,target_)

    res = []
    for k in topk:
        correct_k = tf.cast(tf.reshape(correct[:k],[-1]),dtype=tf.float32)
        correct_k = tf.reduce_sum(correct_k)
        acc = float(correct_k*(100.0 / batch_size))
        res.append(acc)
    return res

#10个样本和6类
output = tf.random.normal([10,6])
#6类概率总和为1
output = tf.math.softmax(output,axis=1)
#随即生成0-5的label,作为target
target = tf.random.uniform([10],maxval=6,dtype=tf.int32)
print('prob:',output.numpy())
#求最大值
pred = tf.argmax(output,axis=1)
print('pred:',pred.numpy())
print('label:',target.numpy())

acc = accurary(output,target,topk=(1,2,3,4,5,6))
print('top-1-6:',acc)

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值