tensorflow estimator许多与adam一起训练的电话

时间:2018-12-05 19:38:37

标签: tensorflow tensorflow-estimator

我在AdamOptimizer中使用了一个张量流自定义估计器,所以我的model_fn看起来像这样:

def model_fn(features, labels, mode, params):
  ...
  loss = ...
  train_op = tf.train.AdamOptimizer(params['learning_rate']).minimize(loss, tf.train.get_global_step())
  if mode == tf.estimator.ModeKeys.TRAIN:
    return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)
  elif mode == tf.estimator.ModeKeys.EVAL:
    return tf.estimator.EstimatorSpec(mode, loss=loss)
  elif mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode, predictions=predictions)

我想实施早期停止机制。为了简化,我正在执行以下操作:

for epoch in range(1000):
  model.train(input_fn=input_fn, steps=self.steps_by_epoch)
  loss = model.evaluate(input_fn=eval_input_fn)['loss']
  if loss < 0.001:
    break

因此model.train将被循环调用,并在每次调用时执行一个数据纪元。

我的问题是:AdamOptimizer(和许多其他优化程序)中的学习率是一个状态变量,应该在最小化过程中不断发展。会在两次调用model.train之间保存它的值,还是会在每次调用时重新初始化它的值?

如果是后者,我如何让Tensorflow记住两次调用model.train之间的变量

1 个答案:

答案 0 :(得分:0)

每次调用model.train()之后,模型状态将保存在检查点中。 由于在Adam优化器中使用的所有参数也是张量流图的变量,因此它们还将保存在检查点中,因此将在下次调用model.train()时被检索。

此外,您还应该研究tf.estimator.train_and_evaluatehttps://www.tensorflow.org/api_docs/python/tf/estimator/train_and_evaluate)。

每当保存检查点时,它将自动进行评估。您可以使用规格控制检查点和评估频率。