我有点困惑,所以我需要你的帮助和领导!
我有一个样本数据集。我有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_k或tf.metrics.recall_at_top_k (我不知道它们之间的确切区别)来获得与我演示的结果相同的结果吗?
非常感谢
发布于 2018-12-15 10:12:37
首先,让我们讨论一下tf.metrics.recall_at_k和tf.metrics.recall_at_top_k之间的区别。
如果您查看开放源代码,您会发现precision_at_k是precision_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标签)。
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。
https://stackoverflow.com/questions/53788685
复制相似问题