Я использую пользовательский оценщик tenorflow с 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