我的模型需要运行多个纪元才能获得不错的结果,并且在Google Cloud上使用v100需要花费几个小时。
由于我处于先发制人的状态,因此在培训过程中使我开始学习。我希望能够从中断处恢复。
在我的自定义CallBack中,我在on_epoch_end中运行self.model.save(...)。如果最近50个时期的得分没有提高,它也会停止训练。
这是我尝试的步骤:
但是,要赶上第一次跑步还需要一些时间。同样,每个时期的准确性得分都接近第一次运行,但更低。最终,较早的停牌开始在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优化器恢复训练的正确方法是什么?
答案 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-model,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-损耗: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
:它返回您设置的初始学习率,并根据一个时期和梯度计算出实际的学习率。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