gpt4 book ai didi

python - 如何使用 tensorflow 计算多标签前 k 个精度?

转载 作者:行者123 更新时间:2023-11-28 21:41:47 24 4
gpt4 key购买 nike

我的任务是预测句子中最有可能出现的五个标签。现在我从输出(密集连接)层获得了未缩放的逻辑:

with tf.name_scope("output"):
scores = tf.nn.xw_plus_b(self.h_drop, W,b, name="scores")
predictions = tf.nn.top_k(self.scores, 5) # should be the k highest score
with tf.name_scope("accuracy"):
labels = input_y # its shape is (batch_size, num_classes)
# calculate the top k accuracy

现在预测就像 [3,1,2,50,12](3,1... 是最高分的索引),而标签是“多热”形式:[0,1, 0,1,1,0...]。 在 python 中,我可以简单地写

correct_preds = [input_y[i]==1 for i in predictions]
weighted = np.dot(correct_preds, [5,4,3,2,1]) # weighted by rank
recall = sum(correct_preds) /sum(input_y)
precision =sum(correct_preds)/len(correct_preds)

但是在tensorflow中,我应该用什么形式来完成这个任务呢?

最佳答案

解决方案

我编写了一个示例来说明如何进行计算。此示例中的所有输入都编码为 tf.constant,但您当然可以替换您的变量。

主要技巧是矩阵乘法。首先是 input_y reshape 为 [1x5] 个矩阵的 2d 倍,称为 to_top5。第二个是 correct_predsweighted_matrix

代码

import tensorflow as tf

input_y = tf.constant( [5,2,9,1] , dtype=tf.int32 )

predictions = tf.constant( [[9,3,5,2,1],[8,9,0,6,5],[1,9,3,4,5],[1,2,3,4,5]])

to_top5 = tf.constant( [[1,1,1,1,1]] , dtype=tf.int32 )
input_y_for_top5 = tf.matmul( tf.reshape(input_y,[-1,1]) , to_top5 )

correct_preds = tf.cast( tf.equal( input_y_for_top5 , predictions ) , dtype=tf.float16 )

weighted_matrix = tf.constant( [[5.],[4.],[3.],[2.],[1.]] , dtype=tf.float16 )

weighted = tf.matmul(correct_preds,weighted_matrix)

recall = tf.reduce_sum(correct_preds) / tf.cast( tf.reduce_sum(input_y) , tf.float16)
precision = tf.reduce_sum(correct_preds) / tf.constant(5.0,dtype=tf.float16)

## training
# Run tensorflow and print the result
with tf.Session() as sess:
print "\n\n=============\n\n"
print "\ninput_y_for_top5"
print sess.run(input_y_for_top5)
print "\ncorrect_preds"
print sess.run(correct_preds)
print "\nweighted"
print sess.run(weighted)
print "\nrecall"
print sess.run(recall)
print "\nprecision"
print sess.run(precision)
print "\n\n=============\n\n"

输出

=============

input_y_for_top5
[[5 5 5 5 5]
[2 2 2 2 2]
[9 9 9 9 9]
[1 1 1 1 1]]

correct_preds
[[ 0. 0. 1. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 1. 0. 0. 0.]
[ 1. 0. 0. 0. 0.]]

weighted
[[ 3.]
[ 0.]
[ 4.]
[ 5.]]

recall
0.17651

precision
0.6001

=============

总结

上面的示例显示了 batch 大小为 4。

第一批的 y_label5,这意味着索引为 5 的元素是第一批的正确标签。此外,第一批的预测是[9,3,5,2,1],这意味着预测函数认为第9个元素最有可能,然后元素 3 是下一个最有可能的,依此类推。

假设我们想要一个批量大小为 3 的示例,然后使用以下代码

input_y = tf.constant( [5,2,9] , dtype=tf.int32 )
predictions = tf.constant( [[9,3,5,2,1],[8,9,0,6,5],[1,9,3,4,5]])

如果我们将上面几行代入程序,我们可以看到它确实正确地计算了批大小为 3 的所有内容。

关于python - 如何使用 tensorflow 计算多标签前 k 个精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44404128/

24 4 0