在特定的epoch保存Keras模型

16

我正在使用Keras对我的数据集进行训练,每次都要运行很费时间,以找到需要的最佳结果所需的epoch数。我尝试使用回调函数来获取最佳模型,但通常太早停止,无法正常工作。此外,每N个epoch保存一次也不适用于我。

我想要做的是在完成某些特定的epoch后保存模型。例如,当epoch = 150结束后,它将被保存为model.save(model_1.h5),并在epoch = 152之后,以及其他几个特定的epoch时,都这样保存。

有没有办法在Keras中实现这个功能?我已经搜索了相关方法,但目前还没有找到合适的。

非常感谢任何帮助或建议。

3个回答

23

编辑
在大多数情况下,使用@Toan Tran在答案中建议的名称格式化就足够了。

但是,如果您需要一些复杂的逻辑,可以使用回调函数,例如

import keras

class CustomSaver(keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs={}):
        if epoch == 2:  # or save after some epoch, each k-th epoch etc.
            self.model.save("model_{}.hd5".format(epoch))

on_epoch_end在每个epoch结束时被调用;epoch是一个epoch的数量,后面的参数是日志(您可以在文档中了解其他回调方法)。将逻辑放入此方法中(例如,示例中尽可能简单)。

创建saver对象并将其放入fit方法中:

import keras
import numpy as np

inp = keras.layers.Input(shape=(10,))
dense = keras.layers.Dense(10, activation='relu')(inp)
out = keras.layers.Dense(1, activation='sigmoid')(dense)
model = keras.models.Model(inp, out)
model.compile(optimizer="adam", loss="binary_crossentropy",)

# Just a noise data for fast working example
X = np.random.normal(0, 1, (1000, 10))
y = np.random.randint(0, 2, 1000)

# create and use callback:
saver = CustomSaver()
model.fit(X, y, callbacks=[saver], epochs=5)

bash 中:

!ls
Out:
model_2.hd5                     

所以,它有效。


谢谢您先生!!解决方案似乎运行良好。 - Wazaki

15
checkpoint = keras.callbacks.ModelCheckpoint('model{epoch:08d}.h5', period=5) 
model.fit(X_train, Y_train, callbacks=[checkpoint])

你尝试过检查点了吗?period=5表示模型在训练5个epoch后保存。

更多细节在这里

希望这有所帮助 :)


谢谢您的建议,但我无法承担每k个时期保存一次的成本。在我感兴趣的时期之前,我的磁盘可能就已经用完了空间。 - Wazaki
请问,如果有很多模型被保存了,我应该使用哪一个来进行评估和预测呢? - user5520049
@user5520049,你可以根据验证损失使用最佳模型,损失越低的模型越好。 - Tony
感谢您的回复,我设置了前三个时期为20,结果如下: 损失:4.7179 - 准确率:0.2422 - 验证损失:4.2133 - 验证准确率:0.2912 损失:4.1017 - 准确率:0.3009 - 验证损失:3.9599 - 验证准确率:0.3136 损失:3.9611 - 准确率:0.3131 - 验证损失:3.8945 - 验证准确率:0.3202。如果我等待一段时间会有所不同吗?或者我该如何决定模型是否已经训练好了? - user5520049
1
好的,看起来你的模型欠拟合了,val_lossval_accuracy表明你的模型没有从数据集中“学习”到任何东西,也许你需要修改它以获得更好的结果或者继续训练100、200个epochs。无论如何,当val_loss接近0(~0.001)时,意味着它已经收敛,你可以停止训练了。 - Tony
非常感谢,但请问您是如何知道这是欠拟合问题的?我将其增加到70个时期,并希望它能够良好运行...但这需要几天时间才能完成...有没有什么方法可以加快速度...我可以使用带GPU的2060 RTX进行工作。 - user5520049

0

嗯,我还不能评论帖子。所以,我要补充一下@Toan Tran的答案。在最新版本的Keras中,参数period已被弃用。相反,我们可以使用save_freq

在以下示例中,模型将在每个epoch之后保存。

checkpoint = keras.callbacks.ModelCheckpoint(model_save_path+'/checkpoint_{epoch:02d}', save_freq='epoch')
H=model.fit(x=x_train, y=y_train,epochs=epoch_no,verbose=2, callbacks=[checkpoint])

您可以从Keras文档中找到更多详细信息。


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