如何将 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 丢失输出记录到文件中的主要内容,如果未能解决你的问题,请参考以下文章