如何在 Tensorflow 中正确使用 tf.metrics.mean_iou 在 Tensorboard 上显示混淆矩阵?
How to properly use tf.metrics.mean_iou in Tensorflow to show confusion matrix on Tensorboard?
我在DeeplabV3+(eval.py)的Tensorflow官方实现中找到了评估脚本,使用tf.metrics.mean_iou
更新平均IOU,并添加到Tensorboard中记录。
tf.metrics.mean_iou
其实是returns2个tensor,一个是计算mean IOU,一个是opdate_op,根据官方文档(doc),混淆矩阵.似乎每次如果你想计算mean_iou,你必须先调用那个update_op。
我正在尝试将此 update_op 作为张量添加到摘要中,但它不起作用。我的问题是如何将这个混淆矩阵添加到 Tensorboard 中?
我看到了一些关于如何通过额外操作计算混淆矩阵并将其添加到 Tensorboard 的其他线程。我只是想知道是否可以在没有这些额外操作的情况下做到这一点。
如有任何帮助,我们将不胜感激。
我会 post 在这里回答,因为有人点赞了。
假设您按以下方式定义了 mean_iou
操作:
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' 的运算。这是您需要计算每个 class.
的召回率和精度的内容
获取节点名称后,您可以通过tf.summary.text
将其添加到您的tensorboard或通过tf.print
功能在您的终端打印。下面是 post 的一个例子:
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 中汇总您的准确率和召回率矩阵:
我在DeeplabV3+(eval.py)的Tensorflow官方实现中找到了评估脚本,使用tf.metrics.mean_iou
更新平均IOU,并添加到Tensorboard中记录。
tf.metrics.mean_iou
其实是returns2个tensor,一个是计算mean IOU,一个是opdate_op,根据官方文档(doc),混淆矩阵.似乎每次如果你想计算mean_iou,你必须先调用那个update_op。
我正在尝试将此 update_op 作为张量添加到摘要中,但它不起作用。我的问题是如何将这个混淆矩阵添加到 Tensorboard 中?
我看到了一些关于如何通过额外操作计算混淆矩阵并将其添加到 Tensorboard 的其他线程。我只是想知道是否可以在没有这些额外操作的情况下做到这一点。
如有任何帮助,我们将不胜感激。
我会 post 在这里回答,因为有人点赞了。
假设您按以下方式定义了 mean_iou
操作:
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' 的运算。这是您需要计算每个 class.
的召回率和精度的内容获取节点名称后,您可以通过tf.summary.text
将其添加到您的tensorboard或通过tf.print
功能在您的终端打印。下面是 post 的一个例子:
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 中汇总您的准确率和召回率矩阵: