Подтвердить что ты не робот

Как записать вывод потери Keras в файл

Когда вы запускаете модель нейронной сети Keras, вы можете увидеть что-то вроде этого в консоли:

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

С течением времени потери, надеюсь, улучшатся. Я хочу записывать эти потери в файл со временем, чтобы я мог учиться у них. Я пробовал:

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

но это не работает. Я не уверен, какой уровень ведения журнала мне нужен в этой ситуации.

Я также попытался использовать обратный вызов, как в:

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

но, очевидно, это не запись в файл. Независимо от метода, через обратный вызов или модуль регистрации или что-то еще, я хотел бы услышать ваши решения для регистрации потери керановой нейронной сети в файл. Благодарю!

4b9b3361

Ответ 1

Есть простое решение вашей проблемы. Каждый раз, когда используется любой из методов fit - в результате возвращается специальный обратный вызов History Callback. Он имеет history полей, которая представляет собой словарь всех метрик, зарегистрированных после каждой эпохи. Таким образом, чтобы получить список значений функции потерь после каждой эпохи, вы можете легко сделать:

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

Такой список легко сохранить в файл (например, преобразовав его в массив numpy и используя метод savetxt).

ОБНОВИТЬ:

Пытаться:

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

ОБНОВЛЕНИЕ 2:

Решение проблемы записи потери после каждой партии записано в документации по обратным вызовам Keras в параграфе " Создать обратный вызов".

Ответ 2

Вы можете использовать обратный вызов CSVLogger.

как пример:

from keras.callbacks import CSVLogger

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

Посмотрите на: Обратные звонки Keras

Ответ 3

Старый вопрос, но здесь идет. Выход истории Keras идеально соответствует входу pandas DataSet.

Если вы хотите, чтобы вся история была csv в одной строке: pandas.DataFrame(model.fit(...).history).to_csv("history.csv")

Приветствия

Ответ 4

Вы можете перенаправить объект sys.stdout в файл перед методом model.fit и переназначить его на стандартную консоль после метода model.fit следующим образом:

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