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

时间:2018-12-15 01:00:57

标签: python tensorflow

我有点困惑,因此我需要您的帮助和领导!

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

enter image description here

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

如果我没记错的话,recall @ k的计算如下:

S1和S2的callback @ 1结果应为0 + 0 = 0(因为S1和S2的Ground T标签的top-1得分最高)

同样,S1和S2的召回率@ 2结果应为0 + 0 = 0(因为S1和S2的前2个结果仍不包含Ground T标签)

最后,S1和S2的callback @ 3结果应为1 +1 = 1(因为S1和S2的前3个结果现在都包含Ground T标签)

如果我是正确的,请您引导我如何使用 tf.metrics.recall_at_k tf.metrics.recall_at_top_k (估算器API)实现此玩具示例strong> (我不知道它们之间的确切差异)是否具有与我展示的结果相同的结果?

非常感谢您

1 个答案:

答案 0 :(得分:2)

首先,让我们讨论一下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期望logits值的浮点张量,但是precision_at_top_k期望整数张量的预测是前k类的索引。

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

计算方法也有一些错误。在计算recall@1时,S1和S2的结果应为(0 + 0)/ 2 = 0(因为S1的T-1标签的top-1得分最高,而不是地面T1且S2的top-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