Python 在每个历元之后进行自定义回调以记录某些信息

Python 在每个历元之后进行自定义回调以记录某些信息,python,machine-learning,keras,Python,Machine Learning,Keras,我知道如何: 如何使用自定义回调函数记录某些信息: def write_metrics(): with open('log.txt', 'a') as f: # append to the log file f.write('{epoch:02d}: loss = {loss:.1f}') model.fit(X, Y, batch_size=4, epochs=32, verbose=1, callbacks=[savemodel, write_metrics])

我知道如何:

如何使用自定义回调函数记录某些信息:

def write_metrics(): 
    with open('log.txt', 'a') as f:  # append to the log file
        f.write('{epoch:02d}: loss = {loss:.1f}')

model.fit(X, Y, batch_size=4, epochs=32, verbose=1, callbacks=[savemodel, write_metrics])
?


对于这段代码,它将不起作用,因为
{loss}
{epoch}
没有在
f.write({epoch:02d}:loss={loss:.1f}')
中定义,实际上,您不需要为此定义函数(甚至使用显式回调),因为这样的信息是由
fit
方法自动返回的;从:

历史

keras.callbacks.History()

将事件记录到
历史记录
对象中的回调

此回调将自动应用于每个Keras模型。这个
History
对象由模型的
fit
方法返回

您甚至不需要显式导入任何内容;您需要的只是:

hist = model.fit(X, Y, batch_size=4, epochs=32, verbose=1, callbacks=[savemodel]) # no other specific callback
hist.history
将包含在每个历元结束时,您可能为培训和验证(如果存在)集定义的损失和任何其他感兴趣的度量(例如准确性),您可以随后将其保存到文件中


有关详细示例,请参见。

下面是解决方案,方法是将
回调子类化:

from keras.callbacks import Callback

class MyLogger(Callback):
    def on_epoch_end(self, epoch, logs=None):
        with open('log.txt', 'a+') as f:
            f.write('%02d %.3f\n' % (epoch, logs['loss']))
然后

甚至

model.fit(X, Y, batch_size=32, epochs=32, verbose=1, callbacks=[MyLogger()])

谢谢你的回答。但事实上,我想在每个历元之后明确地记录这些信息。因此需要回调。为什么?因为有时培训直到最后一个历元才结束(例如,因为GPU云计算很昂贵,我想在最后一个历元结束之前停止,或者因为服务器崩溃或连接中断)。因此,可能无法达到返回值
hist
。@Basj我认为它会-尝试一下:做一个实验,人为地中断执行,看看
hist
;)中包含什么内容@Basj在中看到一般回调条目-相关信息实际上是在每个历元结束时直接从日志传递的,因此即使过早中断,信息仍然会在那里(我将在回答中演示它,但我现在没有访问权限)…在某些地方看到的可能重复的
logs={}
,字典和
logs=None
在您提供的示例中,您能否解释
logs
参数,以及在您的示例中它如何使用
logs['loss']
获取损失?
mylogger = MyLogger()
model.fit(X, Y, batch_size=32, epochs=32, verbose=1, callbacks=[mylogger])
model.fit(X, Y, batch_size=32, epochs=32, verbose=1, callbacks=[MyLogger()])