如何使用keras函数fit_generator()来训练并同时以最低的验证损失保存模型权重?
答案 0 :(得分:3)
您可以使用以下代码保存模型权重。
model.save_weights('weights.h5')
您可以使用以下代码保存模型的体系结构:
model.save('architecure.h5')
如果空间不是问题,那么您可以存储所有模型并选择具有最低验证损失的模型。
或者您可以在每个纪元后使用回调来评估验证损失,并采用当前验证数据损失最小的模型。这可以通过参考以下链接来完成。在此示例中,只需更改传递给TestCallback的数据,并使用一个变量来存储当前的最小验证损失。
class TestCallback(Callback):
def __init__(self, test_data):
self.test_data = test_data
def on_epoch_end(self, epoch, logs={}):
x, y = self.test_data
loss, acc = self.model.evaluate(x, y, verbose=0)
print('\nTesting loss: {}, acc: {}\n'.format(loss, acc))
model.fit(X_train, Y_train, validation_data=(X_val, Y_val),
callbacks=[TestCallback((X_test, Y_test))])
答案 1 :(得分:1)
您可以在定义检查点时设置 save_best_only = True :
int batchSize = 500;
List<Item> items = new ArrayList(batchSize);
for (Item item : asd) {
items.add(item);
if (items.size() >= batchSize) {
//persist
}
}
现在,在拟合模型时,只需包含参数from keras.callbacks import EarlyStopping, ModelCheckpoint
early_stop = EarlyStopping(monitor='loss', min_delta=0.001, patience=3, mode='min', verbose=1)
checkpoint = ModelCheckpoint('model_best_weights.h5', monitor='loss', verbose=1, save_best_only=True, mode='min', period=1
。它将以最小的验证损失节省重量。
callbacks = [early_stop,checkpoint]
如果您也想保存模型架构,则需要将模型序列化为JSON:
model.fit_generator(X_train, Y_train, validation_data=(X_val, Y_val),
callbacks = [early_stop,checkpoint])
最后用架构和权重加载模型:
model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)
请参考:https://machinelearningmastery.com/save-load-keras-deep-learning-models/