2016-07-18 11 views
14

anmelden Wenn Sie einen Keras Neuralnetzwerkmodells laufen könnten Sie so etwas wie dies in der Konsole sehen:Wie Keras Verlust Ausgabe in eine Datei

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

Im Laufe der Zeit den Verlust geht hoffentlich verbessert. Ich möchte diese Verluste im Laufe der Zeit in einer Datei protokollieren, damit ich von ihnen lernen kann. Ich habe versucht:

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

aber das funktioniert nicht. Ich bin mir nicht sicher, welches Protokollierungsniveau ich in dieser Situation brauche.

Ich habe auch versucht, einen Rückruf wie bei der Verwendung:

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

aber offensichtlich ist dies nicht in eine Datei zu schreiben. Unabhängig von der Methode, durch einen Callback oder das Logging-Modul oder irgendetwas anderes, würde ich gerne Ihre Lösungen für die Protokollierung des Verlustes eines Keras neuronalen Netzwerks in einer Datei hören. Vielen Dank!

+0

Eine komplexere Lösung könnte sein TensorFlow Backend und Ausgabeprotokolle zu verwenden, die mit TensorBoard analysiert werden kann. Aber das ist eine andere Frage :-) – Ketil

Antwort

8

Es gibt eine einfache Lösung für Ihr Problem. Jedes Mal, wenn eine der fit Methoden verwendet werden - als Ergebnis wird der spezielle Rückruf History Callback zurückgegeben. Es hat ein Feld history welches ein Wörterbuch aller Metriken ist, die nach jeder Epoche registriert sind. So erhalten Liste der Verlustfunktionswerte nach jeder Epoche können Sie easly tun:

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

Es ist einfach, eine solche Liste in einer Datei zu speichern (zum Beispiel, indem sie es zu numpy Array konvertieren und mit savetxt Methode).

UPDATE:

Versuchen:

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

UPDATE 2:

Die Lösung für das Problem der Aufnahme einen Verlust nach jeder Charge in Keras Callbacks Documentation in einem geschrieben erstellen ein Rückruf Absatz.

+0

Hmm. Können Sie zeigen, wie Sie dies in den Code in der Frage integrieren? Ich habe es versucht und keine Datei wurde erzeugt. Vielleicht wird dies nur die Protokolldatei füllen, nachdem das Training abgeschlossen ist? Ich möchte etwas, das Verlust durch den Trainingsprozess protokollieren kann, so dass ich daraus lernen kann, ohne auf den Abschluss des gesamten Trainings warten zu müssen. – BigBoy1337

+0

ok mit np.savetxt ("loss_history.txt", numpy_loss_history, delimiter = ","), es funktioniert. leider protokolliert es nur den Verlust nach jeder Epoche. Ich frage mich, ob ich es nach jeder Charge schaffen kann. irgendwelche Ideen? – BigBoy1337

+0

Ich aktualisierte meine Antwort. –

0

Sie können die sys.stdout Objekt in eine Datei vor dem model.fit Methode umleiten und an die Standard-Konsole nach model.fit Methode zuweisen wie folgt:

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

alte Frage, aber hier geht. Die Keras History-Ausgabe passt perfekt zu Pandas DataSet-Eingaben.

Wenn Sie die ganze Geschichte zu csv in einer Zeile wollen: pandas.DataFrame(model.fit(...).history).to_csv("history.csv")

Prost

20

können Sie verwenden CSVLogger Rückruf.

als Beispiel:

from keras.callbacks import CSVLogger 

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

Look at: Keras Callbacks

+1

Danke! Ich war auf der Suche nach einem Weg, um den Trainingsstatus zu überprüfen, der nicht auf das Training angewiesen war, um wirklich fertig zu werden (wenn etwas auf dem Weg scheitert oder du keine Rechenzeit auf einem HPC hast, bekommst du nie das History-Objekt und du kannst es nicht sich davon erholen), und das ist es genau. – jjs

+1

Ein wenig mehr Detail (nicht in Keras Dokumente enthalten): Ich bekomme in der folgenden Reihenfolge pro Zeile der produzierten CSV-Datei ausgegeben: "epoch, train_loss, learning_rate, train_metric1, train_metric2, val_loss, val_metric1, val_metric2, ...", Der Verlust wurde in 'model.compile()' und metric1, metric2, metric3 usw. angegeben. werden die Metriken an das Metrikargument übergeben: z.B. 'model.compile (loss = 'mse', metrics = [metrisch1, metrisch2, metrisch3], ...)' @jjs - um Gewicht der Modelle während des Trainings zu sparen, nicht nur Logs, könnte man sich die Keras ansehen ModelCheckPoint-Rückruf. Es funktioniert ähnlich wie der CSVLogger. –