Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

save and load keras.callbacks.History

I'm training a deep neural net using Keras and looking for a way to save and later load the history object which is of keras.callbacks.History type. Here's the setup:

history_model_1 = model_1.fit_generator(train_generator,
                          steps_per_epoch=100,
                          epochs=20,
                          validation_data=validation_generator,
                          validation_steps=50)

history_model_1 is the variable I want to be saved and loaded during another Python session.

like image 923
balkon16 Avatar asked Apr 22 '18 17:04

balkon16


People also ask

What is Keras callbacks history?

keras.callbacks.History() Callback that records events into a History object. This callback is automatically applied to every Keras model. The History object gets returned by the fit method of models.

How do you save a model after every epoch Keras?

We can use the Keras callback keras. callbacks. ModelCheckpoint() to save the model at its best performing epoch.

Can you save a Keras model?

You can save an entire model to a single artifact. It will include: The model's architecture/config. The model's weight values (which were learned during training)


2 Answers

history_model_1 is a callback object. It contains all sorts of data and isn't serializable.

However, it contains a dictionnary with all the values that you actually want to save (cf your comment) :

import json
# Get the dictionary containing each metric and the loss for each epoch
history_dict = history_model_1.history
# Save it under the form of a json file
json.dump(history_dict, open(your_history_path, 'w'))

You can now access the value of the loss at the 50th epoch like this :

print(history_dict['loss'][49])

Reload it with

history_dict = json.load(open(your_history_path, 'r'))

I hope this helps.

like image 116
Nassim Ben Avatar answered Sep 25 '22 12:09

Nassim Ben


You can create a class so you will have the same structure and you can access in both cases with the same code.

import pickle
class History_trained_model(object):
    def __init__(self, history, epoch, params):
        self.history = history
        self.epoch = epoch
        self.params = params

with open(savemodel_path+'/history', 'wb') as file:
    model_history= History_trained_model(history.history, history.epoch, history.params)
    pickle.dump(model_history, file, pickle.HIGHEST_PROTOCOL)

then to access it:

with open(savemodel_path+'/history', 'rb') as file:
    history=pickle.load(file)

print(history.history)
like image 45
Dr. Fabien Tarrade Avatar answered Sep 21 '22 12:09

Dr. Fabien Tarrade