您能给我一个使用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))
答案 0 :(得分:1)
tf.metrics.sparse_average_precision_at_k
将替换为tf.metrics.average_precision_at_k
。通过浏览tensorflow中的代码,您会发现,当您输入的是y_true
和y_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)