Keras中的initial_epoch是什么意思?

时间:2018-09-24 09:23:38

标签: machine-learning keras deep-learning

对于initial_epochfit方法中的fit_generator值,我有些困惑。这是doc

  

initial_epoch :整数。开始训练的时期(用于恢复以前的训练运行)。

我了解,如果您从头开始训练,这没有用。如果您训练了数据集并想要提高准确性或其他值(如果我错了,请纠正我),这将非常有用。但是我不确定它的真正作用。

所以毕竟,我有两个问题:

  1. initial_epoch的作用是什么?
  2. 何时可以使用initial_epoch

    • 何时更改数据集?
    • 当我更改学习率,优化器或损失函数时?
    • 他们两个?

3 个答案:

答案 0 :(得分:13)

由于在某些优化器中,某些内部值(例如学习率)是使用当前 epoch值设置的,甚至您可能具有(自定义){{3 }}取决于epoch当前值initial_epoch参数可让您指定epoch的初始值,以从训练开始。

如文档中所述,这在您对模型进行了某些时期(例如10个)的训练之后,将其保存,现在您想要加载它并继续进行另外10个时期的训练时,这非常有用。时代相关对象(例如优化程序)的状态。因此,您将设置initial_epoch=10(即我们已经为模型训练了10个时期)和epochs=20(不是10,因为要达到的时期总数为20),然后一切恢复了,就像您最初处于在一次培训中对模型进行了20个时期的培训。

但是,请注意,使用Keras的callbacks时,您无需使用initial_epoch,因为它们在内部存储和更新其状态(不考虑当前纪元的值),并且在保存时一个模型,优化器的状态也将被存储。

答案 1 :(得分:0)

上面的答案是正确的,但是要特别注意的是,如果您已经训练了10个纪元并设置了initial_epoch = 10和epochs = 20,则还要再训练10个纪元,直到达到总共20个纪元。例如,我训练了2个时期,然后设置initial_epoch = 2和epochs = 4。结果是训练了另外4-2 = 2个纪元。历史记录对象中的新数据从纪元3开始。因此,返回的历史记录对象确实从纪元1开始。换句话说,历史对象的状态没有从初始训练时期中保存。如果未设置initial_epoch并训练了2个时期,然后以epochs = 4重新运行fit_generator,它将从第二个时期结束时保留的状态开始再训练4个时期(前提是您使用内置的优化程序)。同样,历史对象的状态不会从初始训练中保留下来,而仅包含最后4个时期的数据。我注意到了这一点,因为我绘制了验证损失与时期的关系图。

答案 2 :(得分:0)

这是一个如何在代码中集成 initial_epoch 的示例

#Training first 4 Epcohs and saving
model.fit(x_train, y_train, validation_data=(x_val, y_val), batch_size=32, epochs=4)
model.save("partial.h5")


#loading the model, training another 4 Epochs and then saving the updated model.
from keras.models import load_model
new_model = load_model('partial.h5')
new_model.fit(x_train, y_train, validation_data=(x_val, y_val), batch_size=32, initial_epoch=4,epochs=8)
new_model.save("updated.h5")

另外在将数据拆分成train和test的时候也不要忘记指定一个特定的random_state值,这样每次重新开始训练过程都会遇到同一组训练数据,这样就不会出现test的数据泄露数据输入训练数据。