ML引擎实验eval tf.summary.scalar不在tensorboard中显示

时间:2017-08-25 20:54:01

标签: python tensorflow tensorboard google-cloud-ml-engine

我试图在火车和评估时间的ML引擎实验中输出一些汇总标量。 tf.summary.scalar('loss', loss)正在输出exporboard中相同图上的训练和评估的汇总标量。但是,我也试图在火车和评估时间输出其他指标,它们只在火车时间输出。代码紧跟在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)

为什么损失会在TRAIN& amp; EVAL,而sequence_accuracy只会为TRAIN绘制?

这种行为是否与我收到的警告有关?#34;每次运行发现多个元图事件。用最新的事件覆盖元图。"?

1 个答案:

答案 0 :(得分:2)

因为图中的summary节点只是一个节点。它仍然需要进行评估(输出protobuf字符串),并且该字符串仍然需要写入文件。它不是在训练模式下进行评估,因为它不在图形中的train_op的上游,即使它被评估,也不会写入文件,除非您指定tf.train.SummarySaverHook作为其中一个training_chief_hooks中的EstimatorSpec。因为Estimator类不认为您希望在训练期间进行任何额外评估,所以通常仅在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
      )]
    )

但最好只是增加您的评估频率,并使eval_metric_ops

提高tf.metrics.streaming_accuracy的准确度