[TensorFlow 2] 张量排序

介绍

以龙良曲老师的《深度学习与TensorFlow 2入门实战》为教材,记录一下我的学习笔记。

代码

运行结果

tf.sort

a=tf.random.shuffle(tf.range(5))
tf.sort(a,direction='DESCENDING')

随机打乱[0,1,2,3,4],然后按照从大到小排列

<tf.Tensor , shape=(5,), dtype=int32, numpy=array([4, 3, 2, 1, 0])>

升序的参数为‘direction=‘ASCENDING’’

a=tf.random.uniform([3,3],maxval=10,dtype=tf.int32)

打乱0-9到一个3*3的矩阵中

array([[4, 6, 8],
[9, 4, 7],
[4, 5, 1]])

tf.sort(a)

升序排列

array([[4, 6, 8],
[4, 7, 9],
[1, 4, 5]])

tf.argsort

a=tf.constant([2,0,3,4,1])
tf.argsort(a,direction='DESCENDING')

返回最大值-最小值,的原索引位置

<tf.Tensor , shape=(5,), dtype=int32, numpy=array([3, 2, 0, 4, 1])>

argsort应用

idx=tf.argsort(a,direction='DESCENDING')
tf.gather(a,idx)

同理得到从大到小的排序

<tf.Tensor , shape=(5,), dtype=int32, numpy=array([4, 3, 2, 1, 0])>

tf.topk

a矩阵为 [ 4 6 8 9 4 7 4 5 1 ] \begin{bmatrix} 4 & 6 & 8\\ 9 &4 & 7\\ 4& 5 & 1 \end{bmatrix} 494645871

res=tf.math.top_k(a,2)

res返回a矩阵中,每一行最大的两个值。

res.values

查看res中间的值:

<tf.Tensor , shape=(3, 2), dtype=int32, numpy=array([[8, 6],
[9, 7],
[5, 4]])>

res.indices

返回每行前两个最大值的索引

<tf.Tensor , shape=(3, 2), dtype=int32, numpy=array([[2, 1],
[0, 2],
[1, 0]])>

应用:准确度

  • 假设pred预测概率为[0.1, 0.2, 0.3, 0.4],即最有可能预测值为3
  • 假设正确值为2
  • 利用tf.math.top_k(pred,1) 返回3 => 准确度为0%
  • 利用tf.math.top_k(pred,2) 返回[3, 2] => 假设前两个中有正确值即可,准确度为100%
  • ImageNet 考虑Top-5,假设1000个种类中前五个预测中含有正确值,准确率认为100%

代码分析

import  tensorflow as tf
import  os

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

def accuracy(output, target, topk=(1,)):

output为输出值,batch个样本,每个样本输出值有N个,即[batch, N]的张量
target为正确值,为[batch]的张量
topk=(1,)含义是[top1准确率, top2的准确率, top3的准确率]


    maxk = max(topk)
    batch_size = target.shape[0]

    pred1 = tf.math.top_k(output, maxk).indices
    pred = tf.transpose(pred1, perm=[1, 0])

pred

    target1 = tf.broadcast_to(target, pred.shape)

target1

    correct = tf.equal(pred, target1)

correct计算Top1的准确率,只取第一行,即topk=(1,);
计算Top1、Top2的准确率,取第一行+第二行……

    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

将correct中 True => 1, False => 0
acc:准确度。将topk的每行相加求和/总的batch个数,即预测概率的准确度。

[-1] 表示自动计算此维度

实战分析

output = tf.random.normal([5, 10])
output = tf.math.softmax(output, axis=1)
target = tf.constant([7,3,4,6,1])


acc = accuracy(output, target, topk=(1,2,3,4,5,6,7,8,9,10))
print('top-1-10 acc:', acc)

用MNIST举个例子:
假设这里有5张图片
tf.math.softmax:使得10类的概率总和为1
输出top1-10的准确率:

top-1-10 acc: [60.0, 80.0, 80.0, 80.0, 80.0, 80.0, 100.0, 100.0, 100.0, 100.0,]

在这里插入图片描述在这里插入图片描述

Top10的准确率一定为100%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值