问题描述
当使用如下所示的调度程序时,我很难理解从磁盘加载模型时如何恢复训练。
learning_rate_scheduler = tensorflow.keras.optimizers.schedules.ExponentialDecay(
0.01,decay_steps=1000,decay_rate=0.96,staircase=True)
考虑这种假设情况,我将模型训练了一个 epoch 并保存。后来我加载了模型并再次拟合。在这种情况下,训练是从之前保存模型时的学习率恢复还是从调度程序的预定义配置开始?
编辑
我正在以标准方式保存我的模型,
model.save("model")
以下是加载后的优化器配置。学习率配置与定义相同。
hour_glass_model.optimizer.get_config()
{'amsgrad': False,'beta_1': 0.9,'beta_2': 0.999,'decay': 0.0,'epsilon': 1e-07,'learning_rate': {'class_name': 'ExponentialDecay','config': {'decay_rate': 0.96,'decay_steps': 1000,'initial_learning_rate': 0.01,'name': None,'staircase': True}},'name': 'Adam'}
解决方法
当您在使用 model.save 后重新开始训练时,它会以您保存模型时的学习率进行训练。为了确保我使用学习率调度程序回调编写了一个简单的回调。回调的代码如下所示。然后我训练了 5 个 epochs 的模型,保存模型,加载模型并再次训练。回调打印每个 epoch 开始时的学习率值,并显示训练恢复时学习率被保留。
def scheduler(epoch,lr):
lrin=lr
if epoch < 2:
lrout=lr
else:
lrout= lr * .5
print ('At the start of epoch ',epoch+1,'lr is ',lrin,' will be set to ',lrout,' for epoch ',epoch+2)
return lrout
lrs=tf.keras.callbacks.LearningRateScheduler(scheduler)
在调用model.fit之前将其放入您的代码中。然后在model.fit中包含
callbacks=[lrs]
,
取决于您保存模型的方式。如果您使用带有 Model.save()
的标准方法,则会保存优化器状态。 优化器配置被保存。学习率将从初始值开始
参考:https://www.tensorflow.org/guide/keras/save_and_serialize
另请参阅 save
API,默认情况下具有 include_optimizer=True