【问题标题】:How to log Keras loss output to a file如何将 Keras 丢失输出记录到文件中
【发布时间】:2016-11-21 14:35:16
【问题描述】:

当您运行 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'])

但显然这不是写入文件。无论采用何种方法,通过回调或日志记录模块或其他任何方法,我都希望听到您将 keras 神经网络丢失记录到文件的解决方案。谢谢!

【问题讨论】:

  • 更复杂的解决方案可能是使用 TensorFlow 后端并输出可以使用 TensorBoard 进行分析的日志。但这是一个不同的问题:-)

标签: python logging machine-learning neural-network keras


【解决方案1】:

所以在 TensorFlow 2.0 中,很容易获得每个 epoch 的 Loss 和 Accuracy,因为它返回一个 History 对象。它的 History.history 属性是连续 epoch 的训练损失值和指标值的记录,以及验证损失值和验证指标值

如果你有验证数据

History = model.fit(trainX,trainY,validation_data = (testX,testY),batch_size= 100, epochs = epochs,verbose = 1)
train_loss = History.history['loss']
val_loss   = History.history['val_loss']
acc = History.history['accuracy']
val_acc = History.history['val_accuracy']

如果您没有验证数据

History = model.fit(trainX,trainY,batch_size= 100, epochs = epochs,verbose = 1)
train_loss = History.history['loss']
acc = History.history['accuracy']

然后使用以下代码将列表数据保存到文本文件中

import numpy as np
train_loss = np.array(loss_history)
np.savetxt("train_loss.txt", train_loss, delimiter=",")

【讨论】:

    【解决方案2】:

    最好是创建一个LambdaCallback:

    from keras.callbacks import LambdaCallback
    
    txt_log = open('loss_log.txt', mode='wt', buffering=1)
    
    save_op_callback = LambdaCallback(
      on_epoch_end = lambda epoch, logs: txt_log.write(
        {'epoch': epoch, 'loss': logs['loss']} + '\n'),
      on_train_end = lambda logs: txt_log.close()
    )
    

    现在,只需在 model.fit 函数中这样添加:

    model.fit(...,callbacks = [save_op_callback])
    

    【讨论】:

      【解决方案3】:

      您可以使用 CSVLogger 回调。

      例如:

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

      看:Keras Callbacks

      【讨论】:

      • 谢谢!我一直在寻找一种方法来检查不依赖于训练来实际完成的训练状态(如果在此过程中出现故障或者您在 HPC 上用完了计算时间,您将永远不会获得历史对象并且您不能从中恢复),这正是它。
      • 更多细节(不包含在 Keras 文档中):我按照生成的 csv 文件的每一行的以下顺序获得输出:“epoch, train_loss, learning_rate, train_metric1, train_metric2, val_loss, val_metric1, val_metric2, ...",其中损失在 model.compile() 和 metric1、metric2、metric3 等中指定。是传递给 metrics 参数的指标:例如model.compile(loss='mse', metrics=[metric1, metric2, metric3], ... ) @jjs - 为了在训练期间保存模型的权重,而不仅仅是日志,您可以查看 Keras ModelCheckPoint 回调。它的工作原理类似于 CSVLogger。
      • 嗨!有没有办法只保存 N 个时期的日志而不是全部?谢谢。 @亚历克斯
      • @UpasanaMittal,当然你可以用LambdaCallback
      【解决方案4】:

      您的问题有一个简单的解决方案。每次使用任何fit 方法时,都会返回名为History Callback 的特殊回调。它有一个字段history,它是每个纪元后注册的所有指标的字典。因此,要在每个 epoch 之后获取损失函数值列表,您可以轻松做到:

      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 Callbacks DocumentationCreate a Callback段落中。

      【讨论】:

      • 嗯。您能否展示如何将其集成到问题中的代码中?我试过了,没有生成文件。也许这只会在培训完成后填写日志文件?我想要一些可以在训练过程中记录损失的东西,这样我就可以从中学习,而无需等待整个训练完成。
      • 可以使用 np.savetxt("loss_history.txt", numpy_loss_history, delimiter = ","),它可以工作。不幸的是,它只记录每个时期后的损失。我想知道我是否可以在每批之后这样做。有什么想法吗?
      • 真的叫回调吗?根据您的代码,它只是方法(函数)的返回值。
      • ValueError: 预期 1D 或 2D 数组,改为 0D 数组
      • 我可以使用图像格式的登录吗?比如.png文件?
      【解决方案5】:

      老问题,但这里有。 Keras 历史输出与 pandas DataSet 输入完美匹配。

      如果您希望将整个历史记录保存在一行中: pandas.DataFrame(model.fit(...).history).to_csv("history.csv")

      干杯

      【讨论】:

      • 几个月前我错误地否决了这条评论。虽然,这个答案是完全正确的,它对我非常有用。你知道我怎样才能把这个从down变成upvote吗?对不起!同时,我留下笔记:这个答案是可以的!试试看!
      【解决方案6】:

      您可以将 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
      

      【讨论】:

      • 如果默认设置为 True,这会不会产生 lot 的垃圾?
      猜你喜欢
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      相关资源
      最近更新 更多