如何通用访问TensorFlow/Keras训练历史中不同精度指标以自动绘图
通用化训练历史绘图解决方案
针对TensorFlow/Keras训练history键名随精度配置变化的问题,我们可以通过自动识别键名特征的方式让绘图函数适配不同训练配置,核心思路是根据键名的关键词(含loss/acc)、是否带val_前缀来匹配对应的训练/验证指标。
修改后的通用绘图函数
import matplotlib.pyplot as plt import os def plot_data(training_history, save_path): history_dict = training_history.history # 自动识别训练损失、训练精度的键名 train_loss_key = [k for k in history_dict if 'loss' in k and not k.startswith('val_')][0] train_acc_key = [k for k in history_dict if 'acc' in k and not k.startswith('val_')][0] # 匹配对应的验证指标键名 val_loss_key = f'val_{train_loss_key}' val_acc_key = f'val_{train_acc_key}' # 获取指标数据 acc = history_dict[train_acc_key] val_acc = history_dict[val_acc_key] loss = history_dict[train_loss_key] val_loss = history_dict[val_loss_key] epochs_range = range(len(training_history.epoch)) plt.figure(figsize=(8, 8)) plt.subplot(1, 2, 1) # 动态生成标签与标题,适配不同精度名称 acc_name = train_acc_key.replace("_", " ").title() plt.plot(epochs_range, acc, label=f'Training {acc_name}') plt.plot(epochs_range, val_acc, label=f'Validation {acc_name}') plt.legend(loc='lower right') plt.title(f'Training and Validation {acc_name}') plt.subplot(1, 2, 2) loss_name = train_loss_key.replace("_", " ").title() plt.plot(epochs_range, loss, label=f'Training {loss_name}') plt.plot(epochs_range, val_loss, label=f'Validation {loss_name}') plt.legend(loc='upper right') plt.title(f'Training and Validation {loss_name}') plt.savefig(os.path.join(save_path, 'acc_loss.jpg'), bbox_inches='tight') plt.show(block=False)
关键优化点
- 自动键匹配:通过列表推导式筛选符合特征的键,不管是
accuracy、categorical_accuracy还是其他带acc的精度指标,都能自动识别;损失类指标同理。 - 动态可视化文本:根据识别出的键名自动生成图表的标签和标题,比如当精度键为
categorical_accuracy时,图表会显示"Training Categorical Accuracy",贴合当前训练配置。 - 兼容性保障:基于你提到的「history始终包含四个核心指标」的前提,确保筛选逻辑能拿到唯一匹配的键(若存在多同类型键,可按需调整筛选规则,比如取最后一个或增加额外判断条件)。
内容的提问来源于stack exchange,提问作者Crazy Engineer
相关产品推荐
相关产品推荐

