如何在SummarySaverHook和Estimator中使用tensorflow.metrics.x?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SummarySaverHook和Estimator中使用tensorflow.metrics.x?相关的知识,希望对你有一定的参考价值。
我的问题与这个issue有关。我使用自定义tf.estimator.Estimator
,并希望看到几个不同指标的学习曲线。我使用tf.train.SummarySaverHook
和tf.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。
我想出了怎么做。这很棘手。人们可以通过修改SummarySaverHook
在update_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)创建将调用所有UpdateOpsHook
的update_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)
- 添加此钩子到训练
EstimatorSpec
并且不要忘记将标量添加到evalEstimatorSpec
:
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)
以上是关于如何在SummarySaverHook和Estimator中使用tensorflow.metrics.x?的主要内容,如果未能解决你的问题,请参考以下文章