【问题标题】:Keras How To Resume Training With Adam OptimizerKeras 如何使用 Adam Optimizer 恢复训练
【发布时间】:2019-10-18 06:08:13
【问题描述】:

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

由于我处于抢占式实例中,因此它会在训练过程中将我踢开。我希望能够从中断的地方继续。

在我的自定义回调中,我在 on_epoch_end 中运行 self.model.save(...)。如果在过去 50 个 epoch 中分数没有提高,它也会停止训练。

以下是我尝试的步骤:

  1. 我运行了 model.fit,直到第 250 轮后出现早期停止(最好成绩是在第 200 轮)
  2. 我加载了第 100 个 epoch 后保存的模型。
  3. 我使用 initial_epoch=100 运行 model.fit。 (从 Epoch 101 开始。)

但是,赶上第一次运行需要一段时间。此外,每个 epoch 的准确度得分也接近第一次运行,但更低。终于早停踢到了300左右,最后的分数比第一次还低。获得相同最终分数的唯一方法是从头开始创建模型并从 epoch 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 优化器恢复训练的正确方法是什么?

【问题讨论】:

    标签: python tensorflow machine-learning keras


    【解决方案1】:

    model.load('saved.h5') 呢。如果你用model.save() 保存它,它也应该加载优化器。

    【讨论】:

    • 你的意思是 tf.keras.models.load_model?这就是我正在使用的,但它没有按预期工作。我怀疑这是因为LR没有恢复并从初始值开始。
    【解决方案2】:

    我想知道使用 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')
    
    • 在保存模型之前的初始运行结束时

    10/10 纪元 50000/50000 [===============================] - 13 秒 255us/样本 - 损耗:0.6257 - 加速度:0.7853 - val_loss : 0.8886 - val_acc: 0.6985

    • 从保存的模型中恢复:

    11/13 纪元 50000/50000 [===============================] - 15s 293us/样本 - 损失: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版本。

    【讨论】:

    • 如果您像您提供的示例一样运行几个 epoch,它似乎正在工作,但如果您运行一个需要许多 epoch (如 100 或更多)的示例,它会下降很多。我正在使用 Tensorflow v1.13.1。我还没有尝试过 Tensorflow 2.0 beta。
    • initial_epoch arg 是否会与“新”优化器一起使用并仅通过 load_weights() 加载模型的权重?我问我的模型 h5 文件由于保存过程中的 VM 崩溃而损坏,我只剩下权重 h5 文件(一个单独的文件)...:/
    【解决方案3】:
    • 关于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

    【讨论】:

      猜你喜欢
      • 2020-05-21
      • 1970-01-01
      • 2018-07-04
      • 2018-05-06
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2018-06-08
      相关资源
      最近更新 更多