对于initial_epoch
和fit
方法中的fit_generator
值,我有些困惑。这是doc:
initial_epoch :整数。开始训练的时期(用于恢复以前的训练运行)。
我了解,如果您从头开始训练,这没有用。如果您训练了数据集并想要提高准确性或其他值(如果我错了,请纠正我),这将非常有用。但是我不确定它的真正作用。
所以毕竟,我有两个问题:
initial_epoch
的作用是什么?何时可以使用initial_epoch
?
答案 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的数据泄露数据输入训练数据。