我想使用张量流估计器训练模型,并希望在训练结束评估期间跟踪多个指标。我要跟踪的指标是准确性和均值交集(以及损失)。
我设法弄清楚如何在训练过程中跟踪准确性:
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做总结呢?
答案 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