`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
是不是正确的方法
问题
问题是因为您在 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的整体训练准确率。
我在 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
是不是正确的方法
问题
问题是因为您在 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的整体训练准确率。