我对模块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)的第二个返回值是调用函数的平均精度。但是,我无法理解第一个值,它应该代表准确性。为什么它与我自己计算的准确度值不同?有没有办法获得准确度的非累积值?
提前致谢。
答案 0 :(得分:4)
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()
,即可确保精度度量张量值重新初始化。
为什么会有效?
根据文件
精确度函数创建两个局部变量,total和count 用于计算预测匹配的频率 标签
如果我们不重新初始化局部变量,那么前一次迭代的值仍保留在其中,导致您遇到错误的结果。
另一种方法是使用:
tf.contrib.metrics.accuracy
代替tf.metrics.accuracy
。但是这会在最后给出一些剩余价值,例如0.800000011920929
而不是0.8
。正如OP在评论中指出的那样,它也是deprecated。
来源:
https://www.tensorflow.org/api_docs/python/tf/metrics/accuracy