Keras中的initial_epoch是什么意思?

28

我对fitfit_generator方法中的initial_epoch值有点困惑。以下是文档

initial_epoch:整数。开始训练时的纪元(用于恢复以前的训练)。

如果你从头开始训练,则我理解它没有用处。当你已经训练好数据集并希望提高准确度或其他值(请指正我是否错误)时,它很有用。但我不确定它的真正作用是什么。

所以在这一切之后,我有两个问题:

  1. initial_epoch是什么?它是用来做什么的?
  2. 我什么时候可以使用initial_epoch
  • 当我更改数据集时?
  • 当我更改学习率、优化器或损失函数时?
  • 两者皆可?
3个回答

51

由于在一些优化器中,它们的一些内部值(例如学习率)是使用当前epoch值来设置的,甚至您可能有依赖于epoch当前值的(自定义)回调函数,因此initial_epoch参数可以让您指定从哪个epoch值开始训练。

如文档所述,当您已经训练了模型的一些轮次(比如10轮),然后保存并加载它,并想要在其基础上再训练另外10轮而不破坏与epoch相关的对象的状态(例如优化器)时,这是非常有用的。因此,您会将initial_epoch=10(即我们已经对模型进行了10次训练)和epochs=20(不是10,因为要达到的总轮次是20)设置好,然后一切都会恢复,就好像您最初在一次训练会话中训练了20个epoch。

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


谢谢您今天的回答。如果我更改了数据集,但没有更改优化器函数或其他编程流程,那么使用哪个initial_epoch是否重要? - ibrahimozgon
@ibrahimözgön 这取决于数据集是否类似(即来自相同的分布)于之前您已经训练过的数据集。如果是类似的,并且您不想设置 initial_epoch,您可以再次编译模型并使用非常低的学习率开始训练,因为您的模型已经学习了一些知识,以很高的学习率开始训练可能会破坏并完全改变迄今为止它已经学到的参数;或者,只需将 initial_epoch 设置为先前训练模型的时期数加1。 - today
非常感谢,我会尝试的。 - ibrahimozgon

6
以上答案是正确的,但需要注意的是,如果您已经训练了10个epochs并设置了initial_epoch=10和epochs=20,则需要再训练10个epochs,直到总共达到20个epochs为止。例如,我先训练了2个epochs,然后设置initial_epoch=2和epochs=4。结果是它会再训练2个epochs,新的history object数据从第3个epoch开始。因此,返回的history object确实不像您预期的那样从epoch 1开始。换句话说,history object的状态没有从初始训练epochs中保留下来。如果您不设置initial_epoch,并且训练了2个epochs,然后重新运行fit_generator并将epochs=4,它将从第二个epoch结束时保留的状态开始再训练4个epochs(前提是使用内置优化器)。同样,history object的状态没有从初始训练中保留,仅包含最后4个epochs的数据。我注意到这一点是因为我绘制了验证损失与epochs的图表。

2

这是一个如何在代码中集成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")

在将数据分成训练集和测试集时,不要忘记指定特定的random_state值,以便每次重新启动训练过程时都会遇到相同的训练数据集,从而避免测试数据泄漏进入训练数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接