我试图在火车和评估时间的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;每次运行发现多个元图事件。用最新的事件覆盖元图。"?
答案 0 :(得分:2)
因为图中的summary
节点只是一个节点。它仍然需要进行评估(输出protobuf字符串),并且该字符串仍然需要写入文件。它不是在训练模式下进行评估,因为它不在图形中的train_op
的上游,即使它被评估,也不会写入文件,除非您指定tf.train.SummarySaverHook
作为其中一个training_chief_hooks
中的EstimatorSpec
。因为Estimator
类不认为您希望在训练期间进行任何额外评估,所以通常仅在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
)]
)
但最好只是增加您的评估频率,并使eval_metric_ops
tf.metrics.streaming_accuracy
的准确度