繁体   English   中英

Keras 如何使用 Adam Optimizer 恢复训练

[英]Keras How To Resume Training With Adam Optimizer

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

由于我在抢占式实例上,它会在训练过程中将我踢开。 我希望能够从它停止的地方恢复。

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

以下是我尝试的步骤:

  1. 我一直运行 model.fit 直到第 250 纪元后早期停止(最好成绩是第 200 纪元)
  2. 我加载了第 100 个时代后保存的模型。
  3. 我用initial_epoch=100运行model.fit。 (它从纪元 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 优化器从我用 Adam(lr=1e-4) 设置的初始 lr 计算实际 lr。

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

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

如此处所述: https : model.save()model.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 - loss: 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版本。

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

  • 关于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM