2017-04-21 595 views
4

我是Keras的新用户。我有一个关于使用Keras的训练程序的问题。如何使用Keras的ModelCheckpoint继续训练模型

由于我的服务器的时间限制(每个作业只能在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.20000的val_loss,并且该脚本产生了一个模型'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' 
... 

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

+1

任何人都可以帮助我吗?非常感谢! –

回答

1

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

我不认为这会很难。你可以根据原来的modelcheckpoint回调类来修改它。

这条线: https://github.com/fchollet/keras/blob/master/keras/callbacks.py#L390

它存储的项目是logget的当前最佳值,它被初始化的if语句作为视情况而定要么-INF/INF。

在你的情况下,你将不得不找到一种方法来读取文件的文件名,做一些字符串操作,然后添加。

我建议将它作为单独的声明..或作为else if

为了避免太多与核心代码混淆。

希望它有助于..