Python 如何将Keras丢失输出记录到文件中
当您运行Keras神经网络模型时,您可能会在控制台中看到如下内容:Python 如何将Keras丢失输出记录到文件中,python,logging,machine-learning,neural-network,keras,Python,Logging,Machine Learning,Neural Network,Keras,当您运行Keras神经网络模型时,您可能会在控制台中看到如下内容: Epoch 1/3 6/1000 [..............................] - ETA: 7994s - loss: 5111.7661 随着时间的推移,损失有望有所改善。我想随着时间的推移将这些损失记录到一个文件中,以便从中学习。我试过: logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
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神经网络的丢失记录到文件中的解决方案。谢谢 您的问题有一个简单的解决方案。每次使用任何
fit
方法时,都会返回名为History callback的特殊回调。它有一个字段history
,它是每个历元之后注册的所有度量的字典。因此,要获得每个历元后的损失函数值列表,您可以轻松地执行以下操作:
history_callback = model.fit(params...)
loss_history = history_callback.history["loss"]
很容易将此类列表保存到文件中(例如,通过将其转换为numpy
数组并使用savetxt
方法)
更新:
尝试:
更新2:
在中写入每个批次后记录损失问题的解决方案创建一个回调段落。您可以将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
老问题,但问题来了。Keras历史输出与数据集输入完全匹配 如果希望在一行中显示整个历史记录:
pandas.DataFrame(model.fit(…).history).to_csv(“history.csv”)
干杯您可以使用CSVLOGER回调
例如:
from keras.callbacks import CSVLogger
csv_logger = CSVLogger('log.csv', append=True, separator=';')
model.fit(X_train, Y_train, callbacks=[csv_logger])
查看:最好是创建一个
LambdaCallback
:
从keras.callbacks导入LambdaCallback
txt\u log=open('loss\u log.txt',mode='wt',buffering=1)
save_op_callback=LambdaCallback(
在\u epoch\u end=lambda epoch上,日志:txt\u log.write(
{'epoch':epoch'loss':日志['loss']}+'\n'),
on_train_end=lambda logs:txt_log.close()
)
现在,只需将其添加到model.fit函数中:
model.fit(…,回调=[save\u op\u callback])
所以在TensorFlow 2.0中,很容易得到每个历元的损失和精度,因为它返回一个历史对象。其History.History属性是连续历次的培训损失值和度量值以及验证损失值和验证度量值的记录
如果你有验证数据
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']
如果您没有验证数据
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=",")
嗯,你能演示一下如何将其集成到问题中的代码中吗?我尝试了这个,但没有生成任何文件。也许这只会在培训完成后填写日志文件?我想要一些可以在培训过程中记录损失的东西,这样我就可以在不等待整个培训完成的情况下从中学习。使用np.savetxt(“loss_history.txt”,numpy_loss_history,delimiter=“,”),就可以了。不幸的是,它只记录每个时代之后的损失。我想知道我是否能让它在每批货之后都这样做。有什么想法吗?真的叫回调吗?根据您的代码,它只是方法(函数)的返回值。ValueError:应该是1D或2D数组,而不是0D数组。我可以使用图像格式的日志吗?例如.png文件?谢谢!我一直在寻找一种方法来检查培训状态,这种状态并不依赖于培训的实际完成(如果某个过程中出现故障,或者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()(损失='mse',度量=[metric1,metric2,metric3],…)
@jjs-要在训练期间保存模型的权重,而不仅仅是日志,您可以查看Keras ModelCheckPoint回调。它的工作原理与CSVLogger类似。嗨!有没有办法只保存N个历史记录而不是所有记录的日志?谢谢@Alex@UpasanaMittal当然,您可以使用LambdaCallback
执行此操作,更复杂的解决方案可能是使用TensorFlow后端和输出日志,这些日志可以通过TensorBoard进行分析。但这是另一个问题:-)如果默认情况下将verbose设置为True,这是否会产生大量垃圾?几个月前,我错误地否决了这条评论。尽管如此,这个答案完全正确,对我非常有用。你知道我怎样才能把这个从“向下投票”改为“向上投票”吗?很抱歉同时,我留下一张便条:这个答案是可以的!试试看!