我在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
之间的变量
答案 0 :(得分:0)
每次调用model.train()
之后,模型状态将保存在检查点中。
由于在Adam优化器中使用的所有参数也是张量流图的变量,因此它们还将保存在检查点中,因此将在下次调用model.train()
时被检索。
此外,您还应该研究tf.estimator.train_and_evaluate
(https://www.tensorflow.org/api_docs/python/tf/estimator/train_and_evaluate)。
每当保存检查点时,它将自动进行评估。您可以使用规格控制检查点和评估频率。