介绍
以龙良曲老师的《深度学习与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])>
应用
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])
target1 = tf.broadcast_to(target, pred.shape)
correct = tf.equal(pred, target1)
计算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%