In Keras, we can return the output of model.fit
to a history as follows:
history = model.fit(X_train, y_train,
batch_size=batch_size,
nb_epoch=nb_epoch,
validation_data=(X_test, y_test))
Now, how to save the history to a file for further uses (e.g. draw plots of acc or loss against epochs)?
What I use is the following:
with open('/trainHistoryDict', 'wb') as file_pi:
pickle.dump(history.history, file_pi)
In this way I save the history as a dictionary in case I want to plot the loss or accuracy later on.
A history
objects has a history
field is a dictionary which helds different training metrics spanned across every training epoch. So e.g. history.history['loss'][99]
will return a loss of your model in a 100th epoch of training. In order to save that you could pickle
this dictionary or simple save different lists from this dictionary to appropriate file.
The model
history can be saved into a file as follows
import json
hist = model.fit(X_train, y_train, epochs=5, batch_size=batch_size,validation_split=0.1)
with open('file.json', 'w') as f:
json.dump(hist.history, f)
I came across the problem that the values inside of the list in keras are not json seriazable. Therefore I wrote this two handy functions for my use cause.
import json,codecs
import numpy as np
def saveHist(path,history):
new_hist = {}
for key in list(history.history.keys()):
if type(history.history[key]) == np.ndarray:
new_hist[key] == history.history[key].tolist()
elif type(history.history[key]) == list:
if type(history.history[key][0]) == np.float64:
new_hist[key] = list(map(float, history.history[key]))
print(new_hist)
with codecs.open(path, 'w', encoding='utf-8') as f:
json.dump(new_hist, f, separators=(',', ':'), sort_keys=True, indent=4)
def loadHist(path):
with codecs.open(path, 'r', encoding='utf-8') as f:
n = json.loads(f.read())
return n
where saveHist just needs to get the path to where the json file should be saved, and the history object returned from the keras fit
or fit_generator
method.