【问题标题】:Meaning of values returned by tensorflow accuracy metrictensorflow 准确度指标返回值的含义
【发布时间】:2018-02-21 15:14:13
【问题描述】:

我对模块 tf.metrics 的函数返回的值有点困惑(例如 tf.metrics.accuracy)。

一段简单的代码,我在其中使用 tf.metrics.accuracy 并使用 tp、tn、fp 和 fn 计算准确度。

import tensorflow as tf

# true and predicted tensors
y_p = tf.placeholder(dtype=tf.int64)
y_t = tf.placeholder(dtype=tf.int64)

# Count true positives, true negatives, false positives and false negatives.
tp = tf.count_nonzero(y_p * y_t)
tn = tf.count_nonzero((y_p - 1) * (y_t - 1))
fp = tf.count_nonzero(y_p * (y_t - 1))
fn = tf.count_nonzero((y_p - 1) * y_t)

acc = tf.metrics.accuracy(y_p, y_t)

# Calculate accuracy, precision, recall and F1 score.
accuracy = (tp + tn) / (tp + fp + fn + tn)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(tf.local_variables_initializer())

    for i in range(4):
        if i == 0:
            yop = [0,0,0,0,0,0,0,0,0,0]
        elif i == 1:
            yop = [0,0,0,0,0,0,0,0,1,1]
        elif i == 2:
            yop = [1,1,1,0,0,0,0,0,0,1]
        else:
            yop = [0,1,1,1,1,1,1,0,0,0]
        tf_a = sess.run(acc, feed_dict={y_p: [0,0,0,0,0,0,0,0,0,0], y_t: yop})
        my_a = sess.run(accuracy, feed_dict={y_p: [0,0,0,0,0,0,0,0,0,0], y_t: yop})
        print("TF accuracy: {0}".format(tf_a))
        print("My accuracy: {0}".format(my_a))

哪个输出

TF accuracy: (0.0, 1.0)
My accuracy: 1.0
TF accuracy: (1.0, 0.9)
My accuracy: 0.8
TF accuracy: (0.9, 0.8)
My accuracy: 0.6
TF accuracy: (0.8, 0.7)
My accuracy: 0.4

我了解 tf.metrics.accuracy 的第二个返回值(update_op)是函数调用次数的平均准确度。但是,我无法理解第一个值,它应该代表准确性。为什么它与我自己计算的精度值不同?有没有办法获得精度的非累积值?

提前致谢。

【问题讨论】:

    标签: python tensorflow metrics


    【解决方案1】:
    import tensorflow as tf
    from sklearn.metrics import accuracy_score
    
    # true and predicted tensors
    y_p = tf.placeholder(dtype=tf.int64)
    y_t = tf.placeholder(dtype=tf.int64)
    
    # Count true positives, true negatives, false positives and false negatives.
    tp = tf.count_nonzero(y_p * y_t)
    tn = tf.count_nonzero((y_p - 1) * (y_t - 1))
    fp = tf.count_nonzero(y_p * (y_t - 1))
    fn = tf.count_nonzero((y_p - 1) * y_t)
    
    acc = tf.metrics.accuracy(predictions=y_p, labels=y_t)
    
    # Calculate accuracy, precision, recall and F1 score.
    accuracy = (tp + tn) / (tp + fp + fn + tn)
    
    with tf.Session() as sess:
        for i in range(4):
            sess.run(tf.global_variables_initializer())
            sess.run(tf.local_variables_initializer())
    
    
            if i == 0:
                yop = [0,0,0,0,0,0,0,0,0,0]
            elif i == 1:
                yop = [0,0,0,0,0,0,0,0,1,1]
            elif i == 2:
                yop = [1,1,1,0,0,0,0,0,0,1]
            else:
                yop = [0,1,1,1,1,1,1,0,0,0]
            print('accuracy_score', accuracy_score([0,0,0,0,0,0,0,0,0,0], yop))
            tf_a = sess.run(acc, feed_dict={y_p: [0,0,0,0,0,0,0,0,0,0], y_t: yop})
            my_a = sess.run(accuracy, feed_dict={y_p: [0,0,0,0,0,0,0,0,0,0], y_t: yop})
            print("TF accuracy: {0}".format(tf_a))
            print("My accuracy: {0}".format(my_a))
            print()
    

    输出:

    accuracy_score 1.0
    TF accuracy: (0.0, 1.0)
    My accuracy: 1.0
    
    accuracy_score 0.8
    TF accuracy: (0.0, 0.8)
    My accuracy: 0.8
    
    accuracy_score 0.6
    TF accuracy: (0.0, 0.6)
    My accuracy: 0.6
    
    accuracy_score 0.4
    TF accuracy: (0.0, 0.4)
    My accuracy: 0.4
    

    只需在循环内移动 tf.local_variables_initializer() 即可确保重新初始化准确度度量张量中的值。

    为什么有效?

    根据文档

    accuracy 函数创建两个局部变量,total 和 count 用于计算预测匹配的频率 标签。

    如果我们不重新初始化局部变量,那么之前迭代的值会保留在其中,从而导致您遇到的错误结果。

    另一种方法是使用:

    tf.contrib.metrics.accuracy 而不是tf.metrics.accuracy。但这最终会产生一些剩余价值,例如 0.800000011920929 而不是 0.8。正如 OP 在 cmets 中指出的那样,它也是 deprecated

    来源:

    https://www.tensorflow.org/api_docs/python/tf/metrics/accuracy

    https://github.com/tensorflow/tensorflow/issues/3971

    How to properly use tf.metrics.accuracy?

    【讨论】:

    • 谢谢,在循环内移动初始化操作确实成功了。那么,返回的第一个值就是之前的平均精度值(因此,重新初始化后等于0.0)。仍然不确定为什么有人需要它而不是准确度的实际值。请注意,tf.contrib.metrics.accuracy 似乎是 deprecated
    • 酷,我会将这些信息添加到答案中。根据我所阅读的内容,工作正在进行tf.metrics.accuracy,讨论使其更直观。
    • @pangasio 但这回答了你的问题,对吗?初始化部分?
    • 明白。是的,它确实回答了我的问题,我将其标记为已接受的答案。再次感谢。
    • 谢谢@pangasio :)
    猜你喜欢
    • 2021-08-02
    • 2021-12-19
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    相关资源
    最近更新 更多