web-dev-qa-db-fra.com

keras: comment sauvegarder l'historique des entraînements

Dans Keras, nous pouvons renvoyer la sortie de model.fit à un historique comme suit:

 history = model.fit(X_train, y_train, 
                     batch_size=batch_size, 
                     nb_Epoch=nb_Epoch,
                     validation_data=(X_test, y_test))

Maintenant, comment enregistrer l’historique dans un fichier pour un usage ultérieur (par exemple, tracer des parcelles d’acc ou de perte en fonction des époques)?

25
jingweimo

Ce que j'utilise est le suivant:

    with open('/trainHistoryDict', 'wb') as file_pi:
        pickle.dump(history.history, file_pi)

De cette façon, je sauvegarde l'historique sous forme de dictionnaire au cas où je souhaiterais tracer la perte ou l'exactitude ultérieurement. 

33
AEndrs

Un objet history a un champ history est un dictionnaire qui contient différentes mesures de formation couvrant toutes les époques de formation. Donc, par exemple history.history['loss'][99] retournera une perte de votre modèle dans une 100e époque de formation. Afin de sauvegarder que vous pourriez pickle ce dictionnaire ou simplement sauvegarder différentes listes de ce dictionnaire dans un fichier approprié.

9
Marcin Możejko

L’historique model peut être sauvegardé dans un fichier comme suit

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)
4

Je suis tombé sur le problème que les valeurs à l’intérieur de la liste dans keras ne sont pas json correctes. Par conséquent, j'ai écrit ces deux fonctions pratiques pour ma cause d'utilisation.

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

où saveHist doit simplement obtenir le chemin où le fichier json doit être enregistré et l'objet historique renvoyé par la méthode keras fit ou fit_generator

1
Kev1n91