1

当使用像下面这样的调度程序时,我很难理解从磁盘加载模型时如何恢复训练。

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'}
4

2 回答 2

2

当您在使用 model.save 后重新开始训练时,它会以保存模型时的学习率进行训练。为了确保我使用学习率调度程序回调编写了一个简单的回调。回调的代码如下所示。然后我训练了一个模型 5 个 epoch,保存模型,加载模型并再次训练。回调在每个 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]
于 2021-03-01T17:48:25.840 回答
1

取决于您如何保存模型。如果您使用标准方法,Model.save() 则保存优化器状态。优化器配置被保存。学习率将从初始值开始

参考:https ://www.tensorflow.org/guide/keras/save_and_serialize

另请参阅默认情况下具有的save APIinclude_optimizer=True

于 2021-03-01T10:19:12.143 回答