Keras如何使用Adam Optimizer恢复培训

时间:2019-06-02 11:32:24

标签: python tensorflow machine-learning keras

我的模型需要运行多个纪元才能获得不错的结果,并且在Google Cloud上使用v100需要花费几个小时。

由于我处于先发制人的状态,因此在培训过程中使我开始学习。我希望能够从中断处恢复。

在我的自定义CallBack中,我在on_epoch_end中运行self.model.save(...)。如果最近50个时期的得分没有提高,它也会停止训练。

这是我尝试的步骤:

  1. 我运行了model.fit,直到第250个时期开始出现尽头(最佳成绩是第200个时期)
  2. 我加载了第100个时间段后保存的模型。
  3. 我以initial_epoch = 100运行了model.fit。 (从Epoch 101开始。)

但是,要赶上第一次跑步还需要一些时间。同样,每个时期的准确性得分都接近第一次运行,但更低。最终,较早的停牌开始在300左右,最终得分低于首轮。我可以获得相同最终分数的唯一方法是从头开始创建模型并从时代1开始运行。

我还尝试使用float(K.get_value(self.model.optimizer.lr))和K.set_value(self.model.optimizer.lr,new_lr)。 但是,self.model.optimizer.lr始终返回相同的数字。我认为这是因为亚当优化器会根据我用Adam(lr = 1e-4)设置的初始lr来计算实际lr。

我想知道使用Adam优化器恢复训练的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

library(dplyr) dummy %>% group_by(id) %>% mutate_at(vars(cols), mode_func) 呢?如果您用model.load('saved.h5')保存优化器,它也应该加载优化器。

答案 1 :(得分:0)

  

我想知道使用Adam优化器恢复训练的正确方法是什么?

如此处所述:https://keras.io/getting-started/faq/#how-can-i-save-a-keras-modelmodel.save()后跟load_model()将负责使用保存的训练配置来编译模型。

if not os.path.exists('tf_keras_cifar10.h5'):
    model = get_model() #this method constructs the model and compiles it 
else:
    model = load_model('tf_keras_cifar10.h5') #load the model from file
    print('lr is ', K.get_session().run(model.optimizer.lr))
    initial_epoch=10
    epochs=13

history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs,validation_data=(x_test, y_test), initial_epoch=initial_epoch)
model.save('tf_keras_cifar10.h5')
  • 在保存模型之前的初始运行结束时

Epoch 10/10 50000/50000 [=============================]-13s 255us / sample-损耗:0.6257-acc:0.7853-val_loss :0.8886-val_acc:0.6985

  • 从保存的模型恢复:

第11/13集 50000/50000 [==============================]-15s 293us / sample-损耗:0.6438-acc:0.7777-val_loss :0.8732-val_acc:0.7083

请检查此问题以及与使用Adam Optimizer(tf.keras)继续进行培训有关的问题:https://github.com/tensorflow/tensorflow/issues/27049

建议升级TF版本。

答案 2 :(得分:0)

  • 关于self.model.optimizer.lr:它返回您设置的初始学习率,并根据一个时期和梯度计算出实际的学习率。
  • Adam优化器使用的变量不仅仅是学习率,因此要确保完全恢复其状态,您可以调用model.optimizer
  • 一个好的做法是初始化模型和优化器,然后使用检查点更新状态字典:

    # ============ Load Checkpoint ============
    model = keras.models.load_model('trained_model.h5')
    # get weights
    modelWeights = model.get_weights()
    # get optimizer state as it was on last epoch
    modelOptimizer = model.optimizer
    
    # ============ Compile Model ============
    # redefine architecture (newModel=models.Sequential(), etc.)
    newModel= redefine_your_model_architecture()
    # compile
    newModel.compile(optimizer=modelOptimizer,
                     loss=loss,
                     metrics=['accuracy'])
    # set trained weights
    newModel.set_weights(modelWeights)
    
    # ============ Resume Training ============
    history = newModel.fit(...)
    

重要提示:您无法使用Tensorflow在GPU上重现完全相同的训练(损失,准确性等),如此处所述:Keras_reproducibility

简而言之:GPU并行运行许多操作,因此不能总是保证执行顺序。由于浮点数的精度有限,即使将多个数字相加,其结果也可能略有不同,具体取决于您添加它们的顺序

另一方面,

PyTorch确实具有在CuDNN设置中修复此执行顺序的功能,如此处所述:PyTorch_reproducibility