tensorflow tf.metrics

时间:2018-02-01 12:52:27

标签: python-3.x tensorflow object-detection-api

我对tensorflow指标(tf.metrics)有一些疑问。有一些指标可用,如准确性,精确度,false_positives等。

根据API精度等至少需要两个参数:

precision("ground truth values", "predicted values")

" session.run"我有一些带有Tensor的结果字典,请参阅下面的图片

result dict

detection boxes

groundtruth box

detection scores

如何使用此值来计算准确度,精度,false_positive等?

我尝试了以下内容:

prec = tf.metrics.precision(result_dict['groundtruth_boxes'],  result_dict['detection_boxes'][0])

但是我收到以下错误:

ValueError: Can not squeeze dim[1], expected a dimension of 1, got 4 for 'precision/remove_squeezable_dimensions/Squeeze' (op: 'Squeeze') with input shapes: [1,4].

无论如何,我的尝试毫无意义,因为计算精确度"真正的积极因素"和#34;误报"是必要的。

1 个答案:

答案 0 :(得分:1)

首先,tf.metrics对于计算多批次的运行指标非常有用。因为他们需要在sess.run()次呼叫中保持状态,所以并不像某些人所假设的那样简单。这是一篇很好的文章,解释了它们的工作原理:http://ronny.rest/blog/post_2017_09_11_tf_metrics/

对于你的问题,tf.metrics.precision的参数必须(有效)是布尔张量。您无法直接输入边界框。例如,以下内容将打印1.0

prediction = tf.constant([1., 1., 2., 2.])
label = tf.constant([1., 1., 3., 3.])
precision, update_op = tf.metrics.precision(label, prediction)

with tf.Session() as sess:
  sess.run(tf.local_variables_initializer())
  sess.run(update_op)
  print sess.run(precision)

因为23都不为零。

您需要自己比较边界框(例如,对于每个框tf.reduce_all(tf.equal(expected_box, predicted_box))),以便每个框都有一个True/False标量。放入向量的所有这些标量将成为predictions的{​​{1}}参数。 tf.metrics.precision参数将是与labels大小相同的True张量。