2016-07-18 7 views
14

Quando si esegue un modello di rete neurale Keras si potrebbe vedere qualcosa di simile nella console:Come accedere uscita perdita Keras in un file

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

Col passare del tempo la perdita si spera migliora. Voglio registrare queste perdite in un file nel tempo in modo che io possa imparare da loro. Ho provato:

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

ma questo non funziona. Non sono sicuro di quale livello di registrazione ho bisogno in questa situazione.

ho anche provato ad utilizzare un callback come in:

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']) 

ma ovviamente questo non è la scrittura su un file. Qualunque sia il metodo, attraverso un callback o il modulo di registrazione o qualsiasi altra cosa, mi piacerebbe sentire le vostre soluzioni per la perdita di registrazione di una rete neurale keras in un file. Grazie!

+0

Una soluzione più complessa potrebbe essere quella di utilizzare i registri tensorflow back-end e di uscita che possono essere analizzati con TensorBoard. Ma questa è una domanda diversa :-) – Ketil

risposta

8

C'è una soluzione semplice al tuo problema. Ogni volta che viene utilizzato uno qualsiasi dei metodi fit, viene restituito il callback speciale chiamato Chiamata alla cronologia. Ha un campo history che è un dizionario di tutte le metriche registrate dopo ogni epoca. Quindi, per ottenere l'elenco dei valori della funzione perdita dopo ogni epoca si può facilmente fare:

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

E 'facile per salvare tale elenco in un file (ad esempio convertendolo in numpy matrice e utilizzando savetxt metodo).

UPDATE:

Prova:

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

UPDATE 2:

La soluzione al problema della registrazione di una perdita dopo ogni lotto è scritto in Keras Callbacks Documentation in un Crea un callback paragrafo.

+0

Hmm. puoi mostrare come integrare questo nel codice nella domanda? Ho provato questo e nessun file è stato generato. Forse questo riempirà solo il file di registro una volta completato l'allenamento? Voglio qualcosa che possa registrare la perdita attraverso il processo di formazione in modo che io possa imparare da esso senza aspettare che l'intero allenamento si completi. – BigBoy1337

+0

ok con np.savetxt ("loss_history.txt", numpy_loss_history, delimiter = ","), funziona. sfortunatamente registra solo la perdita dopo ogni epoca. Mi chiedo se riesco a farlo fare dopo ogni partita. qualche idea? – BigBoy1337

+0

Ho aggiornato la mia risposta. –

0

è possibile reindirizzare l'oggetto sys.stdout in un file prima che il metodo model.fit e riassegnarlo alla console standard dopo metodo model.fit come segue:

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

vecchia questione, ma qui va. L'output cronologico di Keras corrisponde perfettamente all'ingresso DataSet di panda.

Se si desidera che l'intera storia in formato CSV in una sola riga: pandas.DataFrame(model.fit(...).history).to_csv("history.csv")

Acclamazioni

20

È possibile utilizzare CSVLogger callback.

come ad esempio:

from keras.callbacks import CSVLogger 

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

un'occhiata a: Keras Callbacks

+1

Grazie! Stavo cercando un modo per controllare lo stato dell'allenamento che non si basava sull'allenamento per finire (se qualcosa non funziona lungo il percorso o non si ha più tempo di calcolo su una HPC non si ottiene l'oggetto della cronologia e non si può recuperare da quello), e questo è proprio questo. – jjs

+1

Un po 'più di dettaglio (non incluso in Keras docs): ottengo l'output nel seguente ordine per riga del file csv prodotto: "epoch, train_loss, learning_rate, train_metric1, train_metric2, val_loss, val_metric1, val_metric2, ...", dove loss è stato specificato in 'model.compile()' e metric1, metric2, metric3 et. le metriche sono passate all'argomento della metrica: ad es. 'model.compile (loss = 'mse', metrics = [metric1, metric2, metric3], ...)' @jjs - per salvare i pesi dei modelli durante l'allenamento, non solo i registri, potresti dare un'occhiata alle Keras Callback ModelCheckPoint. Funziona in modo simile a CSVLogger. –

Problemi correlati