如何使用Keras的ModelCheckpoint继续训练模型

时间:2017-04-21 15:11:29

标签: machine-learning callback deep-learning keras checkpoint

我是Keras的新用户。我对使用Keras的培训程序有疑问。

由于我服务器的时间限制(每项工作只能在24小时内完成),我必须使用多个10纪元时段训练我的模型。

在训练的第一阶段,在10个时期之后,使用Keras的ModelCheckpoint存储最佳模型的权重。

conf = dict()
conf['nb_epoch'] = 10
callbacks = [
             ModelCheckpoint(filepath='/1st_{epoch:d}_{val_loss:.5f}.hdf5',
             monitor='val_loss', save_best_only=True,
             save_weights_only=False, verbose=0)
            ]   

假设我获得了最佳模型:' 1st_10_1.00000.hdf5'。接下来,我继续使用10个时期训练我的模型并存储最佳模型的权重如下。

model.load_weights('1st_10_1.00000.hdf5')
model.compile(...)
callbacks = [
             ModelCheckpoint(filepath='/2nd_{epoch:d}_{val_loss:.5f}.hdf5',
             monitor='val_loss', save_best_only=True,
             save_weights_only=False, verbose=0)
            ]

但我有一个问题。第二次训练的第1纪元给出了val0000的1.20000,并且该脚本产生了一个模型' 2nd_1_1.20000.hdf5'。显然,新的val_loss大于第一次训练的最佳val_loss(1.00000)。接下来的第二次培训时期似乎是根据模型' 2nd_1_1.20000.hdf5'而不是' 1st_10_1.00000.hdf5'进行培训。

'2nd_1_1.20000.hdf5'
'2nd_1_2.15000.hdf5'
'2nd_1_3.10000.hdf5'
'2nd_1_4.05000.hdf5'
...

我认为没有使用第一次培训期间的更好结果是浪费。任何人都可以指出我修复它的方法,或告诉程序它应该使用前一个培训期间的最佳模型的方式?提前谢谢了!

3 个答案:

答案 0 :(得分:1)

有趣的案例,可能是一个很大的改进......我不认为API目前支持这样的解决方案,除了制作自己的回调函数。

我认为这不会那么难。您可以将其作为原始modelcheckpoint回调类的基础并进行更改。

这一行: https://github.com/fchollet/keras/blob/master/keras/callbacks.py#L390

它存储作为logget的项目的当前最佳值,它在if语句中初始化为-inf / inf,具体取决于具体情况。

在你的情况下,你必须找到一种方法来读取文件的文件名,进行一些字符串操作,然后添加它。

我建议将其添加为单独的声明..或作为else if

避免过多地搞乱核心代码。

希望它有所帮助......

答案 1 :(得分:1)

我遇到了同样的问题,直到我问过这个问题才发现你的问题。根据我得到的反馈,我编写了一个简单的回调函数,用于保存和恢复最佳训练值(例如val_loss)。您可以在此处找到它:How to preserve metric values over training sessions in Keras?

答案 2 :(得分:0)

我最近遇到了类似的问题,尽管上面提供的解决方案效果很好。我尝试了一种更简单的方法,在训练过程完成后,我将ModelCheckpoint对象保存到了pickle文件中。

然后,在随后的运行中,我将还原泡菜对象,而不是创建一个新的ModelCheckpoint实例,类似于我们还原模型的方式。