在训练期间使用tf.metrics.mean_iou

时间:2019-07-12 11:04:58

标签: metrics tensorflow-estimator

我想使用张量流估计器训练模型,并希望在训练结束评估期间跟踪多个指标。我要跟踪的指标是准确性和均值交集(以及损失)。

我设法弄清楚如何在训练过程中跟踪准确性:

if mode == tf.estimator.ModeKeys.TRAIN:
   ...
   accuracy = tf.metrics.accuracy(labels=indices_ground_truth, predictions=indices_prediction, name='acc_op')
   tf.summary.scalar('accuracy', accuracy[1])

和评估:

if mode == tf.estimator.ModeKeys.EVAL:
   ...
   accuracy = tf.metrics.accuracy(labels=indices_ground_truth, predictions=indices_prediction)
   eval_metric_ops = {'accuracy': accuracy}

   return tf.estimator.EstimatorSpec(mode, loss=loss, eval_metric_ops=eval_metric_ops)

为了进行评估,联合上的平均交集是相同的。所以实际上是:

if mode == tf.estimator.ModeKeys.EVAL:
   ...
   miou = tf.metrics.mean_iou(labels=indices_ground_truth, predictions=indices_prediction, num_classes=13)
   accuracy = tf.metrics.accuracy(labels=indices_ground_truth, predictions=indices_prediction)
   eval_metric_ops = {'miou': miou,
                      'accuracy': accuracy}

   return tf.estimator.EstimatorSpec(mode, loss=loss, eval_metric_ops=eval_metric_ops)

据我所知,我必须在训练过程中跟踪值的更新操作(第二个返回值)。否则,每次都返回0。对于像准确性这样的单个值。

但是对于miou,第二个返回值是用于计算miou的混淆矩阵的更新操作。就是[numClass,numClass]张量。如果我尝试像精度tf.summary.scalar('miou', miou[1])那样跟踪它,则会崩溃,因为[numClass,numClass]张量不是标量。

tf.summary.scalar('miou', miou[0])每次给我0。 那我怎么给miou做总结呢?

1 个答案:

答案 0 :(得分:0)

这是我在训练时如何计算IoU:

mIoU, update_op = tf.contrib.metrics.streaming_mean_iou(predict, raw_gt, num_classes=2, weights=None)
    tf.summary.scalar('meanIoU', mIoU)

confusion_matrix, _ = sess.run([update_op, train_op], feed_dict=feed_dict)
iou = sess.run(mIoU)

print('iou score = {:.3f}, ({:.3f} sec/step)'.format(iou, duration))

您无需跟踪混淆矩阵输出即可在张量板上跟踪IoU。以上对我来说很好。我认为,您缺少的是在会话中运行张量。您需要运行sess.run(iou)等度量标准操作,同时运行sess.run(update_op)之类的update_op