Tensorflow Streaming_dynamic_auc返回0值且无操作

时间:2019-04-08 06:55:58

标签: python tensorflow

我试图了解如何在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 aucauc之间存在差异auc op始终为None,并且在第一次运行时其值为0。在第二次运行时,值会匹配。

1 个答案:

答案 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模块返回纯张量,则可以在会话中进行评估,因此具有值。