1

我在Tensorflow 1.4中制作了一个自定义估算器。在函数中,我看到了一个参数,我将其用作停止训练然后对我的验证数据集进行评估的一种方式。estimator.trainsteps

while True:
    model.train(input_fn= lambda:train_input_fn(train_data), steps = FLAGS.num_steps)
    model.evaluate(input_fn= lambda:train_input_fn(test_data))

之后,我在验证数据集num_steps上运行评估。我观察到的是,在完成评估之后, AUC/损失函数(通常是所有指标)的图中会有一个混蛋。num_steps

附图在此处输入图像描述

我无法理解为什么会这样。

这不是定期评估metrics的正确方法吗validation dataset

链接到代码

4

1 回答 1

1

问题

问题来自这样一个事实,即您在 TensorBoard 中绘制的是自estimator.train.

以下是详细情况:

  • 您根据第二个输出创建摘要tf.metrics.accuracy
accuracy = tf.metrics.accuracy(labels, predictions)
tf.summary.scalar('accuracy', accuracy[1])
  • 当您调用 时estimator.train(),会创建一个新的 Session 并再次初始化所有局部变量。这包括accuracy(sum 和 count)的局部变量

  • 在此会话期间,操作tf.summary.merge_all()会定期调用。发生的情况是,您的摘要是自您上次调用以来处理的所有批次的准确性estimator.train()。因此,在每个训练阶段开始时,输出都非常嘈杂,一旦你进步,它就会变得更加稳定。

  • 每当您再次评估和调用estimator.train()时,局部变量都会再次初始化,并且您会进入一个短暂的“嘈杂”阶段,这会导致训练曲线出现颠簸


一个办法

如果您想要一个标量摘要,为您提供每个批次的实际准确性,那么您似乎需要在不使用tf.metrics. 例如,如果您想要准确度,您需要执行以下操作:

accuracy = tf.reduce_mean(tf.cast(tf.equal(labels, predictions), tf.float32))
tf.summary.scalar('accuracy', accuracy)

为了准确性,很容易实现这一点,我知道为 AUC 做这件事可能会很痛苦,但我现在没有看到更好的解决方案。

也许有这些颠簸并不是那么糟糕。例如,如果您在一个 epoch 上进行训练,您将在最后一个 epoch 上获得整体训练准确度。

于 2018-01-15T08:03:36.343 回答