给我一个代码示例用法tensorflow' tf.metrics.sparse_average_precision_at_k

时间:2017-05-17 20:31:44

标签: tensorflow

您能给我一个使用tf.metrics.sparse_average_precision_at_k的代码示例吗?我在互联网上找不到任何东西...... :(

如果我有一个像这样的多标签数据集(每个示例可能有多个目标标签):

(班级总数= 5)
y1 = [class_0,class_1]
y2 = [class_1,class_2]
y3 = [class_0]

我的系统预测:

预测y1 - > [0.1,0.3,0.2,0.0,0.0]
预测y2 - > [0.0,0.3,0.7,0.4,0.4]
预测y3 - > [0.1,0.3,0.2,0.3,0.5]

如何计算k = 3,例如?

P.S。:如果您无法理解这个例子,请随意提出您自己的例子。

编辑:到目前为止我的代码: 我真的没有得到它......请建议单个预测(仅限y1)以及一次预测(每个预测的真实类别数不同)。

import numpy as np
import tensorflow as tf
sess = tf.InteractiveSession()
tf.local_variables_initializer().run()
y1 = tf.constant( np.array([0, 1])  )
y2 = tf.constant( np.array([1, 2])  )
y3 = tf.constant( np.array([0]) )
p1 = tf.constant( np.array([0.1, 0.3, 0.2, 0.0, 0.0]) )
p2 = tf.constant( np.array([0.0, 0.3, 0.7, 0.4, 0.4]) )
p3 = tf.constant( np.array([0.1, 0.3, 0.2, 0.3, 0.5]) )
metric, update = tf.metrics.sparse_average_precision_at_k(tf.cast(y1, tf.int64), p1, 3)
print(sess.run(update))

2 个答案:

答案 0 :(得分:1)

tf.metrics.sparse_average_precision_at_k将替换为tf.metrics.average_precision_at_k。通过浏览tensorflow中的代码,您会发现,当您输入的是y_truey_pred时,此函数实际上会将y_pred转换为y_pred_idx,通过使用top_k函数。

y_true是形状的张量(batch_size,num_labels),y_pred是形状的张量(batch_size,num_classes)

您还可以在此issue中看到一些讨论,该示例来自此问题。

import tensorflow as tf
import numpy as np

y_true = np.array([[2], [1], [0], [3], [0]]).astype(np.int64)
y_true = tf.identity(y_true)

y_pred = np.array([[0.1, 0.2, 0.6, 0.1],
                   [0.8, 0.05, 0.1, 0.05],
                   [0.3, 0.4, 0.1, 0.2],
                   [0.6, 0.25, 0.1, 0.05],
                   [0.1, 0.2, 0.6, 0.1]
                   ]).astype(np.float32)
y_pred = tf.identity(y_pred)

_, m_ap = tf.metrics.sparse_average_precision_at_k(y_true, y_pred, 3)

sess = tf.Session()
sess.run(tf.local_variables_initializer())

stream_vars = [i for i in tf.local_variables()]

tf_map = sess.run(m_ap)
print(tf_map)

print((sess.run(stream_vars)))

tmp_rank = tf.nn.top_k(y_pred,3)

print(sess.run(tmp_rank))

此行stream_vars = [i for i in tf.local_variables()]可帮助您查看在此two local_variables函数中创建的tf.metrics.sparse_average_precision_at_k

此行tmp_rank = tf.nn.top_k(y_pred,3)通过更改k中使用的预测索引tf.metrics.sparse_average_precision_at_k的值来帮助您理解。

您可以更改k的值以查看不同的结果,tmp_rank代表用于计算平均精度的索引。

例如: 当k=1时,只有第一批匹配标签,因此average precision at 1的结果将是1/6 = 0.16666666。 当k=2时,第三批也将与标签匹配,因此average precision at 2的结果将是(1+(1/2))/6=0.25

答案 1 :(得分:0)

metric, update = tf.metrics.sparse_average_precision_at_k(tf.stack(y1, y2, y3), tf.stack(p1, p2, p3), 3)
print session.run(update)