首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用tf.metrics.recall_at_k?

如何正确使用tf.metrics.recall_at_k?
EN

Stack Overflow用户
提问于 2018-12-15 01:00:56
回答 1查看 2.1K关注 0票数 4

我有点困惑,所以我需要你的帮助和领导!

我有一个样本数据集。我有2个来源和4个目标,如下表所示。每个单元格代表一个源和一个目标的分数。

S1=T1的地面T标签,S2=T3的地面T标签

如果我没有错,召回@k的计算方式如下:

S1和S2的召回@1的结果应该是0+0=0(因为S1和S2没有最高的T级分数)。

同样,S1和S2的召回@2结果应该是0+0=0(因为S1和S2的前2名结果仍然不包含基本T标签)。

最后,S1和S2的召回@3结果应该是1+1=1(因为S1和S2的前3项结果现在包含了基本T标签)。

如果我是对的,请您引导我如何在tensorflow (估值器API)中实现这个玩具示例,方法是使用tf.metrics.recall_at_ktf.metrics.recall_at_top_k (我不知道它们之间的确切区别)来获得与我演示的结果相同的结果吗?

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-15 10:12:37

首先,让我们讨论一下tf.metrics.recall_at_ktf.metrics.recall_at_top_k之间的区别。

如果您查看开放源代码,您会发现precision_at_kprecision_at_top_k的一个简单包装器。precision_at_k首先应用tf.nn.top_k,然后调用precision_at_top_k。文档显示,precision_at_k需要一个logit值的浮动张量,但是precision_at_top_k期望整数张量--预测值--是顶级k类的索引。

因此,如果您的值是logit得分值,则应该使用precision_at_k

在计算方法上也存在一些错误。在计算recall@1结果时,S1和S2应该是(0 + 0)/2=0 (因为S1的得分最高-1到T4标签,而不是地面,T1和S2的得分最高-1到T1,而不是到地面T3标签)。

代码语言:javascript
复制
import tensorflow as tf
import numpy as np

y_true = np.array([ [0], [2]]).astype(np.int64)
y_true = tf.identity(y_true)
y_pred = np.array([[1, 2, 1, 4],
                   [3, 2, 1, 0]
                   ]).astype(np.float32)
y_pred = tf.identity(y_pred)
k = 1
_, update_recall = tf.metrics.recall_at_k(y_true, y_pred, k)

tmp_rank = tf.nn.top_k(y_pred, k)
stream_vars = [i for i in tf.local_variables()]

with tf.Session() as sess:
    sess.run(tf.local_variables_initializer())
    print("update_recall: ",sess.run(update_recall ))
    print("STREAM_VARS: ",(sess.run(stream_vars)))
    print("TMP_RANK: ",sess.run(tmp_rank))

#print
update_recall:  0.0
STREAM_VARS:  [0.0, 2.0]
TMP_RANK:  TopKV2(values=array([[4.],
       [3.]], dtype=float32), indices=array([[3],
       [0]], dtype=int32))

您可以尝试更改k的值以查看recall@k

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53788685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档