如何将 Keras 丢失输出记录到文件中

Posted

技术标签:

【中文标题】如何将 Keras 丢失输出记录到文件中【英文标题】:How to log Keras loss output to a file 【发布时间】: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 进行分析的日志。但这是一个不同的问题:-) 【参考方案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 Documentation的Create 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 的垃圾?

以上是关于如何将 Keras 丢失输出记录到文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何将 keras LSTM 层的输出输入到输入层?

keras:如何保存历史对象的训练历史属性

如何制作 Makefile 以将命令及其输出记录到文件中?

如何将所有终端输出记录/协议到python中的文本文件中[重复]

如何将 keras 模型文件加载到 OpenCV 代码中?

如何将 cv2.imread 匹配到 keras image.img_load 输出