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_frequencycheckpoint_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 的准确性