Как правильно использовать tf.metrics.mean_iou в Tensorflow, чтобы показать матрицу путаницы на Tensorboard?

Я нашел оценочный скрипт в официальной реализации Tensorflow DeeplabV3+ (eval.py) использует tf.metrics.mean_iou для обновления средней долговой расписки и добавляет ее в Tensorboard для записи.

tf.metrics.mean_iou на самом деле возвращает 2 тензора, один вычисляется по среднему IOU, другой — opdate_op, и согласно официальному документу (doc), матрица путаницы. Кажется, что каждый раз, когда вы хотите вычислить mean_iou, вы должны сначала вызвать update_op.

Я пытаюсь добавить этот update_op в сводку как тензор, но это не работает. Мой вопрос: как добавить эту матрицу путаницы в Tensorboard?

Я видел несколько других тем о том, как рассчитать матрицу путаницы и добавить ее в Tensorboard с дополнительными операциями. Я просто хотел бы знать, можно ли это сделать без этих дополнительных операций.

Любая помощь будет оценена по достоинству.


person Xinyao Wang    schedule 24.05.2019    source источник


Ответы (1)


Я опубликую свой ответ здесь, так как кто-то проголосовал за него.

Допустим, вы определили mean_iou op следующим образом:

    miou, update_op = tf.metrics.mean_iou(
        predictions, labels, dataset.num_of_classes, weights=weights)
    tf.summary.scalar(predictions_tag, miou)

Если вы видите свой график в Tensorboard, вы обнаружите, что есть узел с именем «mean_iou», и после расширения этого узла вы обнаружите, что есть операция с именем «total_confucion_matrix». Это то, что вам нужно для расчета отзыва и точности для каждого класса.

введите здесь описание изображения

После того, как вы получите имя узла, вы можете добавить его на свою тензорную доску с помощью tf.summary.text или распечатать в своем терминале с помощью функции tf.print. Пример размещен ниже:

    miou, update_op = tf.metrics.mean_iou(
        predictions, labels, dataset.num_of_classes, weights=weights)
    tf.summary.scalar(predictions_tag, miou)
    # Get the correct tensor name of confusion matrix, different graphs may vary
    confusion_matrix = tf.get_default_graph().get_tensor_by_name('mean_iou/total_confusion_matrix:0')

    # Calculate precision and recall matrix
    precision = confusion_matrix / tf.reshape(tf.reduce_sum(confusion_matrix, 1), [-1, 1])
    recall = confusion_matrix / tf.reshape(tf.reduce_sum(confusion_matrix, 0), [-1, 1])

    # Print precision, recall and miou in terminal
    precision_op = tf.print("Precision:\n", precision,
                         output_stream=sys.stdout)
    recall_op = tf.print("Recall:\n", recall,
                         output_stream=sys.stdout)
    miou_op = tf.print("Miou:\n", miou,
                         output_stream=sys.stdout)

    # Add precision and recall matrix in Tensorboard
    tf.summary.text('recall_matrix', tf.dtypes.as_string(recall, precision=4))
    tf.summary.text('precision_matrix', tf.dtypes.as_string(precision, precision=4))

    # Create summary hooks
    summary_op = tf.summary.merge_all()
    summary_hook = tf.contrib.training.SummaryAtEndHook(
        log_dir=FLAGS.eval_logdir, summary_op=summary_op)
    precision_op_hook = tf.train.FinalOpsHook(precision_op)
    recall_op_hook = tf.train.FinalOpsHook(recall_op)
    miou_op_hook = tf.train.FinalOpsHook(miou_op)
    hooks = [summary_hook, precision_op_hook, recall_op_hook, miou_op_hook]

    num_eval_iters = None
    if FLAGS.max_number_of_evaluations > 0:
      num_eval_iters = FLAGS.max_number_of_evaluations

    if FLAGS.quantize_delay_step >= 0:
      tf.contrib.quantize.create_eval_graph()

    tf.contrib.training.evaluate_repeatedly(
        master=FLAGS.master,
        checkpoint_dir=FLAGS.checkpoint_dir,
        eval_ops=[update_op],
        max_number_of_evaluations=num_eval_iters,
        hooks=hooks,
        eval_interval_secs=FLAGS.eval_interval_secs)

Затем ваша матрица точности и отзыва будет суммирована в вашей Tensorboard: введите здесь описание изображения

person Xinyao Wang    schedule 15.10.2019