Keras 如何使用 Adam Optimizer 恢复训练

jl3*_*303 8 python machine-learning keras tensorflow

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

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

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

以下是我尝试过的步骤:

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

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

Man*_*han 5

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

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

  • 从保存的模型恢复:

Epoch 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版本。


Nat*_*oen 0

关于什么model.load('saved.h5')。如果您保存它,它也应该加载优化器model.save()

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