如何将Keras模型训练进度保存至文件?
解决Keras训练日志保存到文件的几种方法
我之前在集群上跑Keras模型时也碰到过这个问题——本地能实时看到训练进度,但集群上没法直观跟踪,把日志存到文件里就方便多了,给你分享几个靠谱的解决方法:
1. 用Keras内置的CSVLogger回调(最推荐)
这是Keras官方提供的工具,专门用来把训练过程的指标(loss、val_loss等)保存成结构化的CSV文件,后续还能方便地分析数据。
用法很简单,先导入回调,然后在model.fit()里指定回调即可:
from keras.callbacks import CSVLogger # 初始化CSVLogger,指定日志文件名,append=True表示如果文件存在就追加(适合继续训练) csv_logger = CSVLogger('training_log.csv', append=True, separator=',') # 训练模型时加入回调 model.fit(x_train, y_train, epochs=10, validation_data=(x_val, y_val), callbacks=[csv_logger])
生成的CSV文件会包含每一轮的epoch数、loss、val_loss等信息,格式清晰,用Excel或者Python的pandas就能轻松查看。
2. 命令行重定向输出(和本地输出完全一致)
如果你想要和本地笔记本上完全一样的输出内容(包括"Train on X samples..."、进度条、每轮耗时这些),直接用命令行的重定向功能就行,不用改代码:
python your_training_script.py > training_output.txt 2>&1
这里的>是把标准输出(stdout)写到文件,2>&1是把错误输出(stderr)也重定向到同一个文件,这样所有的训练日志都会被保存下来,和你本地看到的一模一样。
3. 自定义回调函数(适合个性化需求)
如果需要自定义日志的格式或者额外记录一些信息,可以自己写一个Callback类,灵活控制日志内容:
from keras.callbacks import Callback import datetime class CustomLogger(Callback): def __init__(self, log_file): self.log_file = log_file # 打开文件,设置追加模式 self.f = open(log_file, 'a') def on_train_begin(self, logs=None): # 记录训练开始时间 start_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.f.write(f"Training started at {start_time}\n") def on_epoch_end(self, epoch, logs=None): # 记录每一轮的指标和耗时(如果有的话) log_str = f"Epoch {epoch+1}/{self.params['epochs']} - loss: {logs['loss']:.4f} - val_loss: {logs['val_loss']:.4f}\n" self.f.write(log_str) # 强制刷新缓冲区,确保日志实时写入文件 self.f.flush() def on_train_end(self, logs=None): end_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.f.write(f"Training ended at {end_time}\n") self.f.close() # 使用自定义回调 custom_logger = CustomLogger('custom_training_log.txt') model.fit(x_train, y_train, epochs=10, validation_data=(x_val, y_val), callbacks=[custom_logger])
这个方法可以根据你的需求添加任意内容,比如学习率变化、自定义指标等,非常灵活。
内容的提问来源于stack exchange,提问作者MRM
相关产品推荐
相关产品推荐

