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!
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.
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
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é
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