如何将TensorFlow模型运行结果与相关指标记录保存到CSV文件
可视化内容存储格式说明
可视化图表本身是渲染后的二进制图像文件,不支持直接保存为CSV格式。生成图表用到的所有原始结构化数据(逐epoch的accuracy/loss序列、混淆矩阵数值、F1/precision/recall指标值)完全可以导出为CSV,后续直接读取CSV即可复现对应图表,不需要重复运行模型。不建议将渲染后的图像内容转存为CSV,没有实际分析价值,读取效率也极低。
每次运行自动保存所有数据的实现方案
核心思路是每次模型启动时先生成带时间戳的独立存储目录,避免不同次运行的结果互相覆盖,再通过TensorFlow内置回调+简单的后处理逻辑,把所有结构化数据存为CSV、可视化结果存为图片。
依赖准备
用到的库都是常规机器学习栈,不需要额外安装特殊组件:
import os import time import numpy as np import pandas as pd import tensorflow as tf import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import confusion_matrix, f1_score, precision_score, recall_score
步骤1:生成本次运行的独立存储目录
每次启动先获取当前时间戳作为目录名,所有本次运行的产物都存在该目录下:
run_time = time.strftime("%Y%m%d-%H%M%S") save_root = "./cnn_run_records" run_save_dir = os.path.join(save_root, run_time) os.makedirs(run_save_dir, exist_ok=True)
步骤2:配置训练过程指标自动存CSV
直接用TensorFlow内置的CSVLogger回调,训练时每个epoch的训练集/验证集accuracy、loss会自动写入CSV,不需要手动逐轮写文件:
# 定义训练日志CSV存储路径 train_log_path = os.path.join(run_save_dir, "train_epoch_metrics.csv") csv_logger = tf.keras.callbacks.CSVLogger( train_log_path, separator=",", append=False ) # 模型训练时传入回调即可 # model.fit( # train_dataset, # validation_data=val_dataset, # epochs=30, # callbacks=[csv_logger] # 可同时添加早停、学习率衰减等其他回调 # )
步骤3:训练结束后保存全局评估指标、混淆矩阵数据
模型训练完成后,在测试集上做推理,计算全局指标和混淆矩阵,分别存为CSV:
# 提取测试集真实标签,做模型推理 y_true = np.concatenate([label for _, label in test_dataset], axis=0) y_pred_proba = model.predict(test_dataset) y_pred = np.argmax(y_pred_proba, axis=1) # 计算全局评估指标,多分类任务可根据需求调整average参数 global_metrics = { "test_accuracy": [np.mean(y_true == y_pred)], "test_f1": [f1_score(y_true, y_pred, average="macro")], "test_precision": [precision_score(y_true, y_pred, average="macro")], "test_recall": [recall_score(y_true, y_pred, average="macro")] } # 全局指标存CSV pd.DataFrame(global_metrics).to_csv( os.path.join(run_save_dir, "test_global_metrics.csv"), index=False ) # 计算混淆矩阵,原始数值存CSV cm = confusion_matrix(y_true, y_pred) pd.DataFrame(cm).to_csv( os.path.join(run_save_dir, "confusion_matrix_raw.csv"), index=False, header=False )
步骤4:保存可视化图表
用matplotlib/seaborn生成的折线图、热力图直接存为png格式即可,对应的原始数据已经存在前面的CSV里,后续需要调整图表样式直接读CSV重画就行:
# 保存混淆矩阵热力图 plt.figure(figsize=(10, 8)) sns.heatmap(cm, annot=True, fmt="d", cmap="Blues") plt.xlabel("Predicted label") plt.ylabel("True label") plt.savefig(os.path.join(run_save_dir, "confusion_matrix.png"), dpi=300, bbox_inches="tight") plt.close() # 读取训练日志,保存accuracy、loss变化曲线 train_log = pd.read_csv(train_log_path) plt.figure(figsize=(10, 6)) plt.plot(train_log["epoch"], train_log["accuracy"], label="train_accuracy") plt.plot(train_log["epoch"], train_log["val_accuracy"], label="val_accuracy") plt.plot(train_log["epoch"], train_log["loss"], label="train_loss") plt.plot(train_log["epoch"], train_log["val_loss"], label="val_loss") plt.xlabel("Epoch") plt.legend() plt.savefig(os.path.join(run_save_dir, "train_curve.png"), dpi=300, bbox_inches="tight") plt.close()
补充说明
- 如果需要在训练过程中逐epoch记录F1、precision、recall等自定义指标,可以继承
tf.keras.callbacks.Callback实现自定义回调,在on_epoch_end方法中计算对应指标后追加写入CSV即可,逻辑和内置CSVLogger一致。 - 所有结构化数值统一存CSV、可视化渲染结果存图片的分类存储方式,后续做不同实验的效果对比时,可以直接批量读取各次运行目录下的CSV做统计,不需要解析图片内容。
内容的提问来源于stack exchange,提问作者NOCi
相关产品推荐
相关产品推荐

