如何在SummarySaverHook和Estimator中使用tensorflow.metrics.x?

问题描述 投票:0回答:1

我的问题与这个issue有关。我使用自定义tf.estimator.Estimator,并希望看到几个不同指标的学习曲线。我使用tf.train.SummarySaverHooktf.train.LoggingTensorHook。例如,我想添加accuracy并在Tensorboad上查看它。我做以下事情:

acc_value, acc_op = tf.metrics.accuracy(labels=labels, predictions=preds)
tf.summary.scalar('metrics_accuracy', acc_op)

一切正常,但它有效,因为我使用的acc_op总是非零。另一方面,一些指标为None返回op,使用它们的唯一方法是做tf.summary.scalar('metrics_accuracy', acc_value)。以下是issue讨论的问题。 metrics.x值的第一个值始终为零,这是在训练期间始终打印的值。如何使用它?

P.S。:没有其op值的度量标准是dynamic_streaming_auc,问题讨论here。不,我没有使用它,我正在使用它的修改版本 - 自定义auc。

python tensorflow
1个回答
0
投票

我想出了怎么做。这很棘手。人们可以通过修改SummarySaverHookupdate_ops方法中调用before_run来做到这一点。这是步骤。

1)在model_fn中定义估算器,将度量值op加到tf.GraphKeys.UPDATE_OPS,将其值加到tf.summary.scalar

acc_value, acc_op = tf.metrics.accuracy(labels=labels, predictions=preds)
tf.add_to_collection(tf.GraphKeys.UPDATE_OPS, acc_op)
tf.summary.scalar('accuracy', acc_value)

2)创建将调用所有UpdateOpsHookupdate_ops

class UpdateOpsHook(tf.train.SessionRunHook):
    """Hook to execute all `update_ops` from tf.GraphKeys.UPDATE_OPS before each run.
    One needs to call `update_ops` to see metric values during training."""

    def __init__(self):
        # Get all update_ops for (streaming) metrics, which are added
        # into `tf.GraphKeys.UPDATE_OPS` during creation of the graph
        self._update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS, scope='metrics')

    def begin(self):
        self._global_step_tensor = tf.train.get_global_step()
        if self._global_step_tensor is None:
            raise RuntimeError("Global step should be created to use UpdateOpsHook.")

    def before_run(self, run_context):
        # Run `update_ops`
        return tf.train.SessionRunArgs(fetches=self._update_ops)
  1. 添加此钩子到训练EstimatorSpec并且不要忘记将标量添加到eval EstimatorSpec
update_op_hook = UpdateOpsHook()
summary_op = tf.summary.merge_all()
if mode == tf.estimator.ModeKeys.TRAIN:
    summary_train_hook = tf.train.SummarySaverHook(
            save_steps=100,
            output_dir='train_summaries',
            summary_op=summary_op)
    optimizer = tf.train.AdamOptimizer()
    train_op = optimizer.minimize(loss)
    return tf.estimator.EstimatorSpec(mode=mode, predictions=preds, loss=loss,
                                          train_op=train_op,
                                          training_hooks=[summary_train_hook, update_op_hook]
                                          )
eval_metric_ops = {'accuracy': (acc_value, acc_op)}
return tf.estimator.EstimatorSpec(
        mode=mode, predictions=preds, loss=loss, eval_metric_ops=eval_metric_ops)
© www.soinside.com 2019 - 2024. All rights reserved.