import tensorflow as tf
tf.random.set_seed(2467) # 随机种子,我也没搞明白是什么玩意
output = tf.random.normal([10, 6]) # 模拟预测的结果,10个样本,6类分类
output = tf.math.softmax(output, axis=1) # 使得每一行的总和为1(归一化的感觉)
target = tf.random.uniform([10], maxval=6, dtype=tf.int32) # 10个样本的真实标签
print(‘原始数据:‘, output.numpy())
pred = tf.argmax(output, axis=1) # 10个样本预测的类别是
print(‘预测类别:‘, pred.numpy())
print(‘实际类别:‘, target.numpy())
def accuracy(output, target, topk=(1,)): # 定义求精确度的函数
maxk = max(topk) # maxk=6
batch_size = target.shape[0] # batch_size的值为10
pred = tf.math.top_k(output, maxk).indices # 获得每个样本最符合的前6个类别的索引 (10,6)
pred = tf.transpose(pred, perm=[1, 0]) # 转置一下pred矩阵 (6,10)
target_ = tf.broadcast_to(target, pred.shape) # 将真实类别广播到相同大小的矩阵,方便比较 (6,10)
correct = tf.equal(pred, target_) # 得到一个由True和False组成的(6,10)的矩阵
res = [] # 这是要返回的精确值
for k in topk:
# 计算前k行的所有1的和,所有预测对的值
correct_k = tf.reduce_sum(tf.cast(tf.reshape(correct[:k], [-1]), dtype=tf.int32))
acc = float(correct_k / batch_size) # 求精确度
res.append(acc)
return res
acc = accuracy(output, target, topk=(1, 2, 3, 4, 5, 6))
print(‘top1-6的accuracy是:‘, acc)
Neural Network 学习3 Top-k的学习实例