【问题标题】:Tensorflow streaming_dynamic_auc returns 0 value and None opTensorFlow streaming_dynamic_auc 返回 0 值和无操作
【发布时间】:2019-04-08 06:55:57
【问题描述】:

我试图了解如何在 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。但在第二次运行时,值匹配。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    不,这是预期的行为。 TF 指标输出一个值元组并更新操作,即更新值。因此,在第一次运行实际值时,指标的第一个输出将为 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)
    

    附:我不知道您使用的特定应用程序和 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'>,而指标模块返回普通张量,可以在会话内部进行评估,因此具有价值。

    【讨论】:

    • 我正在研究aucs的不同实现,对使用它并不感兴趣。另一个问题是它的操作总是None。我不能添加它的摘要。如果我这样做tf.summary.scalar('metrics_auc', auc_value),我只会得到零,并且不能添加为tf.summary.scalar('metrics_auc', auc_op),因为auc_opNone
    • 这取决于你在哪里寻找。张量板?要在此处添加摘要,您需要将它们合并并使用tf.summary.FileWriter 编写
    • 如果您运行我的代码并将_ 替换为auc_op 并查看它,它始终是None。并将其添加到摘要中会导致错误。我还使用了一个基于CustomEstoimator 的相当大的系统。我有日志钩子和摘要保护程序钩子,对于这个特定的 auc,两者都输出零。默认的 auc 工作正常。
    • 这很容易是数据造成的。尝试将其与一些预定义的常量作为 logits/labels 隔离使用
    • 嗯,我不确定我是否跟随。如果我使用上面的代码为tf.metrics.auc 打印auc_op,它在每次调用时都有值。 auc_op 对于 streaming_dynamic_auc 始终是 None。这是如何由数据引起的?我对两者使用相同的数据。
    猜你喜欢
    • 2018-10-15
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2018-09-04
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多