Keras训练时如何将Epoch训练日志保存至TXT文件?
嘿,刚好有几个超简便的方法能帮你把Keras的训练日志存到TXT文件里,再也不用手动复制粘贴啦,给你挨个说:
方法1:用Keras内置的CSVLogger(最推荐)
这是最省心的方案,Keras官方已经帮你封装好了,不仅能自动保存每一轮的训练指标,还会生成结构化的表头,后续用Pandas或者Excel分析都超方便。它默认存成CSV格式,但本质就是文本文件,直接改成.txt后缀也完全能用。
from keras.callbacks import CSVLogger from keras.models import Sequential from keras.layers import Dense # 先定义好你的模型(这里是示例结构,替换成你自己的即可) model = Sequential() model.add(Dense(64, activation='relu', input_dim=100)) model.add(Dense(10, activation='softmax')) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['mean_absolute_error', 'categorical_accuracy']) # 初始化CSVLogger,指定保存的文件名,分隔符可以选逗号或空格 csv_logger = CSVLogger('training_logs.txt', separator=' ', append=False) # 训练时把回调函数传进去就行 model.fit(x_train, y_train, epochs=75, batch_size=32, validation_data=(x_val, y_val), callbacks=[csv_logger])
生成的日志文件会是这样的结构化格式,一目了然:
epoch,loss,mean_absolute_error,categorical_accuracy,val_loss,val_mean_absolute_error,val_categorical_accuracy
16,0.0079,0.0585,0.9836,0.0797,0.2410,0.7901
17,0.0080,...
方法2:重定向控制台输出到文件
如果你就想要和控制台完全一模一样的日志格式,那可以试试把Python的标准输出直接重定向到文件,这样所有打印到控制台的内容都会原封不动存到TXT里。
import sys from keras.models import Sequential from keras.layers import Dense # 先保存原始的控制台输出通道 original_stdout = sys.stdout # 打开目标文件,准备写入日志 with open('training_logs.txt', 'w') as f: # 把标准输出重定向到文件 sys.stdout = f # 这里放你的模型定义和训练代码 model = Sequential() model.add(Dense(64, activation='relu', input_dim=100)) model.add(Dense(10, activation='softmax')) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['mean_absolute_error', 'categorical_accuracy']) model.fit(x_train, y_train, epochs=75, batch_size=32, validation_data=(x_val, y_val)) # 训练完恢复原始的控制台输出 sys.stdout = original_stdout
这个方法的好处是完全保留你贴出来的那种日志样式,训练时控制台不会显示内容,但所有内容都会写到文件里。
方法3:自定义回调函数(灵活控制内容)
如果你只想保存特定的指标,或者想自定义日志的格式细节,那可以自己写个回调函数,完全按照你的需求来生成日志。
from keras.callbacks import Callback from keras.models import Sequential from keras.layers import Dense class CustomLogger(Callback): def __init__(self, filename): self.filename = filename # 训练开始时先清空或创建文件 with open(self.filename, 'w') as f: pass def on_epoch_end(self, epoch, logs=None): logs = logs or {} # 完全自定义日志格式,和控制台输出对齐 log_str = f"Epoch {epoch+1}/75 183/183 [==============================] - 587s 3s/step - loss: {logs['loss']:.4f} - mean_absolute_error: {logs['mean_absolute_error']:.4f} - categorical_accuracy: {logs['categorical_accuracy']:.4f} - val_loss: {logs['val_loss']:.4f} - val_mean_absolute_error: {logs['val_mean_absolute_error']:.4f} - val_categorical_accuracy: {logs['val_categorical_accuracy']:.4f}\n" with open(self.filename, 'a') as f: f.write(log_str) # 初始化自定义回调 custom_logger = CustomLogger('training_logs.txt') # 训练时传入回调 model = Sequential() model.add(Dense(64, activation='relu', input_dim=100)) model.add(Dense(10, activation='softmax')) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['mean_absolute_error', 'categorical_accuracy']) model.fit(x_train, y_train, epochs=75, batch_size=32, validation_data=(x_val, y_val), callbacks=[custom_logger])
这个方法可以随意调整日志里的内容,比如只保留loss和准确率,或者修改数值的小数位数,自由度拉满。
内容的提问来源于stack exchange,提问作者Alejandro Simkievich
相关产品推荐
相关产品推荐

