ML 引擎实验评估 tf.summary.scalar 未在张量板上显示
ML Engine Experiment eval tf.summary.scalar not displaying in tensorboard
我正在尝试在训练和评估时间的 ML 引擎实验中输出一些汇总标量。 tf.summary.scalar('loss', loss)
在 tensorboard 的同一图上正确输出训练和评估的汇总标量。但是,我也试图在训练和评估时输出其他指标,它们只在训练时输出。该代码紧跟在 tf.summary.scalar('loss', loss)
之后,但似乎不起作用。例如,下面的代码只是为 TRAIN 输出,而没有为 EVAL 输出。唯一的区别是它们使用自定义精度函数,但它们适用于 TRAIN
if mode in (Modes.TRAIN, Modes.EVAL):
loss = tf.contrib.legacy_seq2seq.sequence_loss(logits, outputs, weights)
tf.summary.scalar('loss', loss)
sequence_accuracy = sequence_accuracy(targets, predictions,weights)
tf.summary.scalar('sequence_accuracy', sequence_accuracy)
为什么 loss 会在 tensorboard 中为 TRAIN 和 EVAL 绘制,而 sequence_accuracy 只会为 TRAIN 绘制,这有什么意义吗?
此行为是否与我收到的警告有关 "Found more than one metagraph event per run. Overwriting the metagraph with the newest event."?
因为图中的summary
节点只是一个节点。它仍然需要评估(输出 protobuf 字符串),并且该字符串仍然需要写入文件。它未在训练模式下进行评估,因为它不在图表中 train_op
的上游,即使进行了评估,也不会将其写入文件,除非您将 tf.train.SummarySaverHook
指定为其中之一training_chief_hooks
在你的 EstimatorSpec
中。因为 Estimator
class 不假设您在训练期间需要任何额外的评估,通常评估仅在 EVAL 阶段进行,您只需将 min_eval_frequency
或 checkpoint_frequency
增加到获取更多评估数据点。
如果您真的想在训练期间记录总结,您可以这样做:
def model_fn(mode, features, labels, params):
...
if mode == Modes.TRAIN:
# loss is already written out during training, don't duplicate the summary op
loss = tf.contrib.legacy_seq2seq.sequence_loss(logits, outputs, weights)
sequence_accuracy = sequence_accuracy(targets, predictions,weights)
seq_sum_op = tf.summary.scalar('sequence_accuracy', sequence_accuracy)
with tf.control_depencencies([seq_sum_op]):
train_op = optimizer.minimize(loss)
return tf.estimator.EstimatorSpec(
loss=loss,
mode=mode,
train_op=train_op,
training_chief_hooks=[tf.train.SummarySaverHook(
save_steps=100,
output_dir='./summaries',
summary_op=seq_sum_op
)]
)
但最好只是增加评估频率并使用 tf.metrics.streaming_accuracy
进行 eval_metric_ops
的准确性
我正在尝试在训练和评估时间的 ML 引擎实验中输出一些汇总标量。 tf.summary.scalar('loss', loss)
在 tensorboard 的同一图上正确输出训练和评估的汇总标量。但是,我也试图在训练和评估时输出其他指标,它们只在训练时输出。该代码紧跟在 tf.summary.scalar('loss', loss)
之后,但似乎不起作用。例如,下面的代码只是为 TRAIN 输出,而没有为 EVAL 输出。唯一的区别是它们使用自定义精度函数,但它们适用于 TRAIN
if mode in (Modes.TRAIN, Modes.EVAL):
loss = tf.contrib.legacy_seq2seq.sequence_loss(logits, outputs, weights)
tf.summary.scalar('loss', loss)
sequence_accuracy = sequence_accuracy(targets, predictions,weights)
tf.summary.scalar('sequence_accuracy', sequence_accuracy)
为什么 loss 会在 tensorboard 中为 TRAIN 和 EVAL 绘制,而 sequence_accuracy 只会为 TRAIN 绘制,这有什么意义吗?
此行为是否与我收到的警告有关 "Found more than one metagraph event per run. Overwriting the metagraph with the newest event."?
因为图中的summary
节点只是一个节点。它仍然需要评估(输出 protobuf 字符串),并且该字符串仍然需要写入文件。它未在训练模式下进行评估,因为它不在图表中 train_op
的上游,即使进行了评估,也不会将其写入文件,除非您将 tf.train.SummarySaverHook
指定为其中之一training_chief_hooks
在你的 EstimatorSpec
中。因为 Estimator
class 不假设您在训练期间需要任何额外的评估,通常评估仅在 EVAL 阶段进行,您只需将 min_eval_frequency
或 checkpoint_frequency
增加到获取更多评估数据点。
如果您真的想在训练期间记录总结,您可以这样做:
def model_fn(mode, features, labels, params):
...
if mode == Modes.TRAIN:
# loss is already written out during training, don't duplicate the summary op
loss = tf.contrib.legacy_seq2seq.sequence_loss(logits, outputs, weights)
sequence_accuracy = sequence_accuracy(targets, predictions,weights)
seq_sum_op = tf.summary.scalar('sequence_accuracy', sequence_accuracy)
with tf.control_depencencies([seq_sum_op]):
train_op = optimizer.minimize(loss)
return tf.estimator.EstimatorSpec(
loss=loss,
mode=mode,
train_op=train_op,
training_chief_hooks=[tf.train.SummarySaverHook(
save_steps=100,
output_dir='./summaries',
summary_op=seq_sum_op
)]
)
但最好只是增加评估频率并使用 tf.metrics.streaming_accuracy
eval_metric_ops
的准确性