我试图了解如何在Tensorflow中汇总指标变量,并且遇到tf.contrib.metrics.streaming_dynamic_auc
。它汇总了预测和标签,这似乎很简单,但令我困惑的是,初始化后的第一次运行给出0,而所有后续运行都很好。这是代码。
import tensorflow as tf
import random
random.seed(121231)
n_points = 1000
y_true = [random.randint(0, 1) for _ in xrange(n_points)]
y_pred = [random.random() for _ in xrange(n_points)]
pds = tf.placeholder(tf.float32, [n_points])
lbs = tf.placeholder(tf.int32, [n_points])
with tf.Session() as sess:
auc_dynamic = tf.contrib.metrics.streaming_dynamic_auc(predictions=pds, labels=lbs)
auc = tf.metrics.auc(predictions=pds, labels=lbs)
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
auc_dynamic_val, auc_dynamic_op = sess.run(auc_dynamic, {pds:y_pred, lbs:y_true})
auc_val, auc_op = sess.run(auc, {pds: y_pred, lbs: y_true})
print("1st run. Dynamic auc val %.7f, op: %s" % (auc_dynamic_val, auc_dynamic_op))
print("1st run. Auc val %.7f, op: %s" % (auc_val, auc_op))
auc_dynamic_val, auc_dynamic_op = sess.run(auc_dynamic, {pds: y_pred, lbs: y_true})
auc_val, auc_op = sess.run(auc, {pds: y_pred, lbs: y_true})
print("2nd run. Dynamic auc val %.7f, op: %s" % (auc_dynamic_val, auc_dynamic_op))
print("2nd run. Auc val %.7f, op: %s" % (auc_val, auc_op))
它打印:
1st run. Dynamic auc val 0.0000000, op: None
1st run. Auc val 0.0000000, op: 0.5043121
2nd run. Dynamic auc val 0.5043422, op: None
2nd run. Auc val 0.5043121, op: 0.5043121
dynamic auc
与auc
之间存在差异auc op
始终为None
,并且在第一次运行时其值为0。在第二次运行时,值会匹配。
答案 0 :(得分:1)
不,这是预期的行为。 TF指标输出值的元组并更新op,即更新值。因此,在第一次运行实际值时,度量标准的第一个输出将为0。如果仅两次打印两个值,则将看到在第二次运行中两个值都不为零。
with tf.Session() as sess:
auc_tf = tf.contrib.metrics.streaming_dynamic_auc(predictions=pds, labels=lbs)
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
auc_tf_val = sess.run(auc_tf, {pds:y_pred, lbs:y_true})
print(auc_tf_val)
auc_tf_val = sess.run(auc_tf, {pds: y_pred, lbs: y_true})
print(auc_tf_val)
P.S。我不知道您正在使用的特定应用程序和TF版本,但我想最好使用tf.metrics.auc
。 Contrib模块将在以后的版本中弃用。
https://www.tensorflow.org/api_docs/python/tf/metrics/auc
编辑:关于特定情况,在问题中提到。 update_op的值始终为None
,因为它的计算方式不同。如果contrib模块指标为<class 'tensorflow.python.framework.ops.Operation'>
,而metrics模块返回纯张量,则可以在会话中进行评估,因此具有值。