`estimator.train` 在 Tensorflow 中带有 num_steps

`estimator.train` with num_steps in Tensorflow

我在 Tensorflow 1.4 中制作了一个 自定义估算器 。在 estimator.train 函数中,我看到一个 steps 参数,我将其用作 停止 训练然后 评估 [=42] 的一种方式=] 在我的 验证数据集上 .

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 之后,我 运行 在 验证数据集 上进行评估。 我观察到的是,在 num_steps 之后,一旦评估完成,AUC/Loss 函数(通常所有度量) 的图中就会出现一个混蛋。

附剧情 :

我不明白为什么会这样。

定期在validation dataset上评估metrics是不是正确的方法

Link to code

问题

问题是因为您在 TensorBoard 中绘制的是自 estimator.train 开始以来计算的准确性或 AUC。

详细情况如下:

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

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

  • 每当您再次评估和调用 estimator.train() 时,局部变量会再次初始化,您会进入一个短暂的 "noisy" 阶段,这会导致 颠簸 在训练曲线上。


一个解决方案

如果您想要一个标量摘要来为您提供每个批次的实际准确性,您似乎需要在不使用 tf.metrics 的情况下实现它。例如,如果你想要你需要做的准确性:

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

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

也许有这些颠簸并不是那么糟糕。比如你训练一个epoch,最后你会得到一个epoch的整体训练准确率。