机器学习 – 如何使用Keras的ModelCheckpoint继续训练模型

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

由于我的服务器的时间限制(每个作业只能在不到24小时内运行),我必须使用多个10-epoch周期来训练我的模型.

在训练的第一阶段,在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'
...

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

最佳答案 有趣的情况,可能是一个很大的改进…我不认为API目前支持这样的解决方案,除了自己的回调函数.

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

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

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

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

我建议将其作为一个单独的声明添加..或者作为其他if.

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

希望它有所帮助..

点赞