2016-07-18 22 views
14

Po uruchomieniu Keras model sieci neuronowej można zobaczyć coś takiego w konsoli:Jak zalogować wyjście strat Keras do pliku

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

miarę upływu czasu utraty nadzieją poprawia. Chcę z upływem czasu rejestrować te straty w pliku, aby móc się z nich uczyć. Próbowałem:

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

ale to nie działa. Nie wiem, jakiego poziomu rejestrowania potrzebuję w tej sytuacji.

Próbowałem również za pomocą zwrotnego jak w:

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

ale oczywiście to nie jest pisanie do pliku. Bez względu na metodę, za pośrednictwem wywołania zwrotnego lub modułu rejestrowania lub cokolwiek innego, chciałbym usłyszeć swoje rozwiązania do rejestrowania utraty sieci neuronowej keras do pliku. Dzięki!

+0

bardziej złożony rozwiązaniem może być użycie TensorFlow silnikiem i wyjściowych kłody, która może być analizowany w TensorBoard. Ale to inne pytanie :-) – Ketil

Odpowiedz

8

Istnieje proste rozwiązanie problemu. Za każdym razem, gdy używana jest jedna z metod fit - zwracana jest specjalna funkcja zwrotna o nazwie Historia oddzwonienia. Ma pole history, które jest słownikiem wszystkich metryk zarejestrowanych po każdej epoce. Więc listę wartości funkcji straty dostać po każdej epoce można w łatwy zrobić:

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

Łatwo zapisać taką listę do pliku (na przykład poprzez przekształcenie go do numpy tablicy i korzystania savetxt metody).

UPDATE:

Spróbuj:

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

UPDATE 2:

Rozwiązaniem problemu nagrywania stratę po każdej partii jest napisane w Keras Callbacks Documentation w Tworzenie paragraf.

+0

Hmm. czy możesz pokazać, jak zintegrować to z kodem w pytaniu? Próbowałem tego i nie wygenerowano żadnego pliku. Być może to tylko wypełni plik dziennika po zakończeniu szkolenia? Chcę czegoś, co może rejestrować straty w procesie szkolenia, aby móc uczyć się od niego, nie czekając na ukończenie całego szkolenia. – BigBoy1337

+0

ok z np.savetxt ("loss_history.txt", numpy_loss_history, delimiter = ","), to działa. niestety rejestruje tylko utratę po każdej epoce. Zastanawiam się, czy mogę to zrobić po każdej partii. jakieś pomysły? – BigBoy1337

+0

Zaktualizowałem moją odpowiedź. –

0

można przekierować obiekt sys.stdout do pliku przed metody model.fit i przypisanie go do standardowej konsoli po metody model.fit następująco:

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

Stare pytanie, ale tu idzie. Wyjście historii Keras idealnie pasuje do danych wejściowych DataSet pandy.

Jeśli chcesz całą historię do pliku CSV w jednym wierszu: pandas.DataFrame(model.fit(...).history).to_csv("history.csv")

Cheers

20

Można użyć CSVLogger zwrotnego.

jak np

from keras.callbacks import CSVLogger 

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

Spójrz: Keras Callbacks

+1

Dzięki! Szukałem sposobu na sprawdzenie statusu treningu, który nie polegał na treningu, aby faktycznie zakończyć (jeśli coś zawodzi po drodze lub skończy ci się czas obliczeniowy na HPC, nigdy nie dostaniesz obiektu historii i nie możesz Odzyskać z tego), i to jest właśnie to. – jjs

+1

Trochę więcej szczegółów (nie ma w Keras docs): Otrzymuję dane wyjściowe w następującej kolejności w wierszu wytworzonego pliku csv: "epoki, train_loss, wartość_uczytu uczenia się, parametr_grupy pociągu1, parametr_grupy pociągu2, wartość_aratu, wartość_parametru1, wartość_warunku2, ...", gdzie strata została określona w 'model.compile()' i metryka1, metric2, metric3 et. są dane przekazywane do argumentu metryki: np. 'model.compile (loss = 'mse', metryki = [metric1, metric2, metric3], ...)' @jjs - aby oszczędzać ciężary modeli podczas treningu, a nie tylko logów, możesz rzucić okiem na Keras Wywołanie zwrotne ModelCheckPoint. Działa podobnie jak CSVLogger. –