web-dev-qa-db-fra.com

Comment enregistrer la sortie de perte de Keras dans un fichier

Lorsque vous exécutez un modèle de réseau neuronal Keras, vous pouvez voir quelque chose comme ceci dans la console:

Epoch 1/3
   6/1000 [..............................] - ETA: 7994s - loss: 5111.7661

Avec le temps, la perte s'améliore, espérons-le. Je souhaite consigner ces pertes dans un fichier au fil du temps afin de pouvoir en tirer des leçons. J'ai essayé:

logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)

mais ça ne marche pas. Je ne suis pas sûr du niveau de journalisation dont j'ai besoin dans cette situation.

J'ai aussi essayé d'utiliser un rappel comme dans:

def generate_train_batch():
    while 1:
        for i in xrange(0,dset_X.shape[0],3):
            yield dset_X[i:i+3,:,:,:],dset_y[i:i+3,:,:]

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.losses = []

    def on_batch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))
logloss=LossHistory()
colorize.fit_generator(generate_train_batch(),samples_per_Epoch=1000,nb_Epoch=3,callbacks=['logloss'])

mais évidemment, cela n’écrit pas dans un fichier. Quelle que soit la méthode choisie, via un rappel, le module de journalisation ou toute autre solution, j'aimerais connaître vos solutions pour la journalisation de la perte d'un réseau de neurones keras dans un fichier. Merci!

31
BigBoy1337

Il existe une solution simple à votre problème. Chaque fois que l'une des méthodes fit est utilisée, le rappel spécial appelé Rappel d'historique est renvoyé. Il a un champ history qui est un dictionnaire de toutes les métriques enregistrées après chaque époque. Donc, pour obtenir la liste des valeurs de la fonction de perte après chaque époque, vous pouvez facilement faire:

history_callback = model.fit(params...)
loss_history = history_callback.history["loss"]

Il est facile de sauvegarder une telle liste dans un fichier (par exemple, en la convertissant en tableau numpy et en utilisant la méthode savetxt.).

UPDATE:

Essayer:

import numpy
numpy_loss_history = numpy.array(loss_history)
numpy.savetxt("loss_history.txt", numpy_loss_history, delimiter=",")

UPDATE 2:

La solution au problème de l'enregistrement d'une perte après que chaque lot est écrit dans le documentation Keras Callbacks dans un paragraphe Créer un rappel.

15
Marcin Możejko

Vous pouvez utiliser CSVLogger callback.

à titre d'exemple:

from keras.callbacks import CSVLogger

csv_logger = CSVLogger('log.csv', append=True, separator=';')
model.fit(X_train, Y_train, callbacks=[csv_logger])

Regardez: callbacks Keras

61
Alex Glinsky

Vieille question, mais voilà. L’historique de Keras correspond parfaitement à l’entrée pandas DataSet.

Si vous voulez que l’ensemble de l’historique soit au format csv sur une seule ligne: pandas.DataFrame(model.fit(...).history).to_csv("history.csv")

À votre santé

10
Benjamin Striner

Vous pouvez rediriger l'objet sys.stdout vers un fichier avant la méthode model.fit et le réaffecter à la console standard après la méthode model.fit comme suit:

import sys
oldStdout = sys.stdout
file = open('logFile', 'w')
sys.stdout = file
model.fit(Xtrain, Ytrain)
sys.stdout = oldStdout
1
Nagabhushan Baddi