2017-10-17 91 views
0

我想用tf.metrics.accuracy跟踪我的预测的准确性,但我不确定如何使用update_op(以下acc_update_op),该函数返回:如何使用tf.metrics.accuracy?

accuracy, acc_update_op = tf.metrics.accuracy(labels, predictions) 

我的想法是将其添加到tf.GraphKeys.UPDATE_OPS会有道理,但我不知道如何做到这一点。

回答

4

tf.metrics.accuracy是许多流量度量TensorFlow操作之一(另一个是tf.metrics.recall)。创建后,会创建两个变量(counttotal),以累积所有最终结果的传入结果。第一个返回值是用于计算count/total的张量。返回的第二个op是一个更新这些变量的有状态函数。当评估多个批次数据的分类器性能时,流播的度量函数很有用。用一个简单的例子:

# building phase 
with tf.name_scope("streaming"): 
    accuracy, acc_update_op = tf.metrics.accuracy(labels, predictions) 

test_fetches = { 
    'accuracy': accuracy, 
    'acc_op': acc_update_op 
} 

# when testing the classifier  
with tf.name_scope("streaming"): 
    # clear counters for a fresh evaluation 
    sess.run(tf.local_variables_initializer()) 

for _i in range(n_batches_in_test): 
    fd = get_test_batch() 
    outputs = sess.run(test_fetches, feed_dict=fd) 

print("Accuracy:", outputs['accuracy']) 

我的想法是将其添加到tf.GraphKeys.UPDATE_OPS将是有意义的,但我不知道如何做到这一点。

这不是一个好主意,除非您仅使用UPDATE_OPS集合进行测试。通常情况下,集合已经对训练阶段有一定的控制操作(如移动批处理标准化参数),这些操作并不意味着与验证阶段一起运行。最好将它们保存在新的集合中,或手动将这些操作添加到获取字典中。

+0

好的,我发现使用'tf.GraphKeys.UPDATE_OPS'没有任何意义,但使用'tf.GraphKeys.SUMMARIES'怎么办?我会怎么做呢? –

+1

'tf.GraphKeys.SUMMARIES',你说?这一个是为了保留汇总张量,所以你不应该使用它。没有一个标准的集合键,但你可以选择你自己的一个(例如'metric_ops')。将这些操作集中在一个集合中意味着您将负责确保在评估阶段的每次迭代中执行这些操作。 –

+0

我发现了另一个解决方案,你会不会评论? '与tf.control_dependencies([accuracy_op]):tf.summary.scalar('准确性',准确性)' –