5

我可以在全球每一步都得到训练损失。但我确实想在张量板的图表“lossxx”中添加评估损失。怎么做?

  MyHook 类(tf.train.SessionRunHook):
    def after_run(self,run_context,run_value):
      _session = run_context.session
      _session.run(_session.graph.get_operation_by_name('acc_op'))

  def my_model(功能,标签,模式):
    ...
    logits = tf.layers.dense(net, 3, activation=None)
    predict_classes = tf.argmax(logits, 1)
    如果模式 == tf.estimator.ModeKeys.PREDICT:
      预测 = {
        “类”:预测类,
        “概率”:tf.nn.softmax(logits)
      }
      返回 tf.estimator.EstimatorSpec(模式,预测=预测)

    # 计算损失。
    损失= tf.losses.sparse_softmax_cross_entropy(标签=标签,logits=logits)
    acc, acc_op = tf.metrics.accuracy(labels=labels, predictions=predicted_classes)
    tf.identity(acc_op,'acc_op')
    loss_sum = tf.summary.scalar('lossxx',loss)
    accuracy_sum = tf.summary.scalar('accuracyxx',acc)
    合并 = tf.summary.merge_all()

    # 创建训练操作。
    如果模式 == tf.estimator.ModeKeys.TRAIN:
      优化器 = tf.train.AdagradOptimizer(learning_rate=0.1)
      train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
      return tf.estimator.EstimatorSpec(模式,损失=损失,train_op=train_op,
                                      training_chief_hooks=[
                                            tf.train.SummarySaverHook(save_steps=10, output_dir='./model', summary_op=merg)])

    返回 tf.estimator.EstimatorSpec(
        模式,损失=损失,eval_metric_ops={'accuracy': (acc, acc_op)}
    )


  分类器.train(input_fn=train_input_fn, steps=1000,hooks=[ MyHook()])

在此处输入图像描述

4

2 回答 2

5

您实际上不需要SummarySaverHook自己创建一个,因为它已经包含在tf.estimator.Estimator. 只需创建您想要的所有摘要,每个步骤tf.summary.xxx都会对它们进行评估。n(见tf.estimator.RunConfig这个)。

此外,您无需为最终损失创建摘要loss。这也将自动为您创建。如果你这样做,那么训练和评估摘要将显示在 TensorBoard 上的同一图表中。eval估算器在您的当前创建一个子目录model_dir来实现这一点。

还有一个小提示:acc_op直接在摘要中使用更新指标获取它的值。但是,这些tf.metrics功能很难处理;-)

于 2018-07-13T12:33:15.177 回答
1

您需要通过使用将评估数据与训练数据一起传递给模型 tf.estimator.train_and_evaluate

于 2018-10-20T09:13:33.130 回答