如何在HuggingFace训练时保存训练与验证损失至列表?
保存训练与验证损失的方法
方法一:利用Trainer默认生成的TensorBoard日志
HuggingFace Trainer会自动在output_dir下的runs目录生成TensorBoard格式的日志文件,里面包含训练损失、验证损失等所有监控指标。你可以通过两种方式提取数据:
1. 直接用TensorBoard查看并导出数据
运行以下命令启动TensorBoard:
tensorboard --logdir codeparrot-ds/runs
在界面中找到损失曲线,点击右上角的下载按钮即可导出CSV格式的数据。
2. 用Python代码读取日志文件
使用tensorboard内置工具读取事件文件,提取损失数据:
import pandas as pd from tensorboard.backend.event_processing.event_accumulator import EventAccumulator # 加载日志文件(替换为实际生成的日志文件夹名,通常是日期时间命名) event_acc = EventAccumulator("codeparrot-ds/runs/20240520-143000") event_acc.Reload() # 提取训练损失和验证损失 train_loss = pd.DataFrame(event_acc.Scalars("train_loss"), columns=["step", "wall_time", "value"]) eval_loss = pd.DataFrame(event_acc.Scalars("eval_loss"), columns=["step", "wall_time", "value"]) # 保存为CSV文件 train_loss.to_csv("train_loss.csv", index=False) eval_loss.to_csv("eval_loss.csv", index=False)
方法二:自定义TrainerCallback手动保存损失
如果需要更灵活的控制(比如实时写入文件),可以自定义回调函数,在训练过程中记录并保存损失:
1. 定义回调类
from transformers import TrainerCallback import csv class SaveLossCallback(TrainerCallback): def __init__(self, save_path="loss_logs.csv"): self.save_path = save_path # 初始化CSV表头 with open(self.save_path, "w", newline="") as f: writer = csv.writer(f) writer.writerow(["step", "train_loss", "eval_loss"]) self.current_train_loss = None def on_log(self, args, state, control, logs=None, **kwargs): # 捕获训练损失(每次logging_steps触发) if logs and "loss" in logs: self.current_train_loss = logs["loss"] def on_evaluate(self, args, state, control, metrics=None, **kwargs): # 捕获验证损失并写入文件(每次eval_steps触发) if metrics and "eval_loss" in metrics: with open(self.save_path, "a", newline="") as f: writer = csv.writer(f) writer.writerow([state.global_step, self.current_train_loss, metrics["eval_loss"]])
2. 将回调添加到Trainer中
修改你的Trainer初始化代码,加上callbacks参数:
trainer = Trainer( model=model, tokenizer=tokenizer, args=args, data_collator=data_collator, train_dataset=tokenized_datasets["train"], eval_dataset=tokenized_datasets["valid"], callbacks=[SaveLossCallback()] # 加入自定义回调 )
训练过程中,损失数据会实时写入loss_logs.csv,包含步数、训练损失、验证损失三列。
绘制损失曲线
拿到保存的CSV数据后,用matplotlib即可绘制曲线:
import matplotlib.pyplot as plt import pandas as pd # 读取损失数据 loss_data = pd.read_csv("loss_logs.csv") plt.figure(figsize=(10, 6)) plt.plot(loss_data["step"], loss_data["train_loss"], label="训练损失") plt.plot(loss_data["step"], loss_data["eval_loss"], label="验证损失") plt.xlabel("训练步数") plt.ylabel("损失值") plt.title("训练与验证损失曲线") plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Penguin
相关产品推荐
相关产品推荐

