[英]Keras How To Resume Training With Adam Optimizer
我的模型需要运行多个 epoch 才能获得不错的结果,并且在 Google Cloud 上使用 v100 需要几个小时。
由于我在抢占式实例上,它会在训练过程中将我踢开。 我希望能够从它停止的地方恢复。
在我的自定义回调中,我在 on_epoch_end 中运行 self.model.save(...)。 如果分数在过去 50 个时期内没有提高,它也会停止训练。
以下是我尝试的步骤:
但是,要赶上第一次运行需要一段时间。 此外,每个 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.