gpt4 book ai didi

python - 带有自定义 Estimator 的 Tensorflow 指标

转载 作者:太空宇宙 更新时间:2023-11-03 13:29:11 34 4
gpt4 key购买 nike

我有一个卷积神经网络,我最近重构它以使用 Tensorflow 的 Estimator API,主要遵循 this tutorial .然而,在训练期间,我添加到 EstimatorSpec 的指标没有显示在 Tensorboard 上,并且似乎没有在 tfdbg 中进行评估,尽管名称范围和指标出现在写入 Tensorboard 的图表中。

model_fn 的相关位如下:

 ...

predictions = tf.placeholder(tf.float32, [num_classes], name="predictions")

...

with tf.name_scope("metrics"):
predictions_rounded = tf.round(predictions)
accuracy = tf.metrics.accuracy(input_y, predictions_rounded, name='accuracy')
precision = tf.metrics.precision(input_y, predictions_rounded, name='precision')
recall = tf.metrics.recall(input_y, predictions_rounded, name='recall')

if mode == tf.estimator.ModeKeys.PREDICT:
spec = tf.estimator.EstimatorSpec(mode=mode,
predictions=predictions)
elif mode == tf.estimator.ModeKeys.TRAIN:

...

# if we're doing softmax vs sigmoid, we have different metrics
if cross_entropy == CrossEntropyType.SOFTMAX:
metrics = {
'accuracy': accuracy,
'precision': precision,
'recall': recall
}
elif cross_entropy == CrossEntropyType.SIGMOID:
metrics = {
'precision': precision,
'recall': recall
}
else:
raise NotImplementedError("Unrecognized cross entropy function: {}\t Available types are: SOFTMAX, SIGMOID".format(cross_entropy))
spec = tf.estimator.EstimatorSpec(mode=mode,
loss=loss,
train_op=train_op,
eval_metric_ops=metrics)
else:
raise NotImplementedError('ModeKey provided is not supported: {}'.format(mode))

return spec

有人想知道为什么没有写这些吗?我正在使用 Tensorflow 1.7 和 Python 3.5。我已经尝试通过 tf.summary.scalar 显式添加它们,虽然它们确实以这种方式进入 Tensorboard,但在第一次通过图形后它们永远不会更新。

最佳答案

指标 API 有一个转折点,让我们以 tf.metrics.accuracy 为例(所有 tf.metrics.* 工作相同)。这将返回 2 个值,即 accuracy 指标和一个 upate_op,这看起来像是您的第一个错误。你应该有这样的东西:

accuracy, update_op = tf.metrics.accuracy(input_y, predictions_rounded, name='accuracy')

accuracy 只是您期望计算出的值,但是请注意,您可能希望计算多次调用 sess.run 的准确性,例如例如,当您计算无法全部放入内存的大型测试集的准确性时。这就是 update_op 的用武之地,它会累积结果,因此当您要求 accuracy 时,它会为您提供一个运行记录。

update_op 没有依赖项,因此您需要在 sess.run 中显式运行它或添加依赖项。例如,您可以将其设置为依赖于成本函数,以便在计算成本函数时计算 update_op(导致更新精度的运行计数):

with tf.control_dependencies(cost):
tf.group(update_op, other_update_ops, ...)

您可以使用局部变量初始值设定项重置指标的值:

sess.run(tf.local_variables_initializer())

您需要使用 tf.summary.scalar(accuracy) 为 tensorboard 添加准确性,正如您提到的那样(尽管看起来您添加了错误的东西)。

关于python - 带有自定义 Estimator 的 Tensorflow 指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50120073/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com