给我一个tensorflow';s tf.metrics.sparse\u平均值\u精度\u k
你能给我一个使用给我一个tensorflow';s tf.metrics.sparse\u平均值\u精度\u k,tensorflow,Tensorflow,你能给我一个使用tf.metrics.sparse\u average\u precision\u at_k的代码示例吗?我在网上找不到任何东西…:( 如果我有这样一个多标签数据集(每个示例可能有多个目标标签): (课程总数=5) y1=[等级0,等级1] y2=[等级1,等级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] 例如
tf.metrics.sparse\u average\u precision\u at_k
的代码示例吗?我在网上找不到任何东西…:(
如果我有这样一个多标签数据集(每个示例可能有多个目标标签):
(课程总数=5)y1=[等级0,等级1]
y2=[等级1,等级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 附言:如果你不能理解这个例子,请随意提出你自己的例子
编辑:到目前为止我的代码:
我真的不明白…请建议一个预测(仅y1)以及一次多个预测(每个预测中的真实类数不同)
tf.metrics.sparse\u average\u pred\u at_k
将替换为tf.metrics.average\u precision\u at_k
。通过浏览中的代码,您会发现,当您的输入为y\u true
和y\u pred
时,此函数实际上将使用y\u pred
将转换为y\u pred\u idx
top_k
功能
y\u true
是形状的张量(批次大小,数量标签),而y\u pred
是形状的张量(批次大小,数量类别)
您还可以在本文中看到一些讨论,这个示例来自这个问题
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\u vars=[i for i in tf.local\u variables()]
帮助您查看在tf.metrics.sparse\u average\u precision\u at_k
函数中创建的两个局部变量
这一行tmp\u rank=tf.nn.top\u k(y\u pred,3)
通过更改k
的值来帮助您理解,该值是在tf.metrics.sparse\u average\u precision\u k
中使用的预测索引
您可以更改k
的值以查看不同的结果,tmp\u秩
表示用于计算平均精度的索引
例如:
当k=1
时,只有第一批与标签匹配,因此在1
处的平均精度将为1/6=0.1666666
。
当k=2
时,第三批也将与标签匹配,因此在2处的平均精度将是(1+(1/2))/6=0.25
,我总是得到类似的结果:tensorflow.python.framework.errors\u impl.failedPredicateError:尝试使用未初始化的值average\u precision\u在4处/5处/total[[Node:average_precision_at_4_5/total/read=Identity[T=DT_DOUBLE,_class=[“loc:@average_precision_at_4_5/total”],_device=“/job:localhost/replica:0/task:0/cpu:0”](average_precision_at_at_4_5/total)]]在tensorflow中使用变量之前,您需要初始化变量,并且度量在内部使用局部变量。在任何会话之前运行tf.local\u variables\u initializer().Run()
。运行应该会起作用。我真的不明白……请建议一次预测(仅y1)以及同时进行多个预测(每个中的真实类数不同)-原始问题中的我的代码编辑。关于您的编辑,tf.metrics.sparse\u average\u precision\u at_k
创建变量。当您在会话开始时运行tf.local\u variables\u initializer
时,尚未生成任何局部变量。您需要在sess.run(update)之前运行它
line,因为Tensorflow还不能进行时间旅行
metric, update = tf.metrics.sparse_average_precision_at_k(tf.stack(y1, y2, y3), tf.stack(p1, p2, p3), 3)
print session.run(update)
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))