深度学习中的训练和验证损失
- 训练损失 是指模型 训练数据上的错误。
- 验证损失 是 未见数据的错误,用于评估模型在训练数据集之外的性能。
常见的训练损失函数:
- 均方误差(MSE):用于回归任务。
- 交叉熵损失:常见于分类问题。
在绘制训练和验证损失随时间变化时,可能会出现某些模式。这些模式可以洞悉模型的性能:
- 训练和验证损失均减少:这是理想的。该模型正在有效学习并很好地推广。
- 训练损失减少,验证损失增加(过度拟合):模型很好地学习了训练数据,但无法概括,通常会记住训练数据而不是学习一般特征。
- 训练损失仍然很高,而验证损失保持较低(欠拟合):模型难以从数据中捕捉模式,表明它可能过于简单或训练不足。
使用 TensorBoard 来查看 loss 曲线
PyTorch 版
在 PyTorch 中使用 TensorBoard 来查看 loss 曲线,可以借助 torch.utils.tensorboard.SummaryWriter
。
1. 安装 TensorBoard
如果还没有安装,可以使用以下命令进行安装:
pip install tensorboard
2. 导入并创建 SummaryWriter
在代码中导入 SummaryWriter
并指定日志保存路径:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter(logdir='tensorboard_runs/{}'.format(datetime.datetime.now().strftime("%m-%d_%H-%M-%S")))
这会创建一个 tensorboard_runs/
目录,并在其中存储训练日志。
3. 在训练过程中记录 loss 数据
在训练循环中,将每个 step
或 epoch
的 loss
记录下来。例如:
import torch
import torch.nn as nn
import torch.optim as optim
# 假设已经定义了模型 MyModel 和数据加载器 train_loader
model = MyModel()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
num_epochs = 10
for epoch in range(num_epochs):
for i, (inputs, labels) in enumerate(train_loader):
outputs = model(inputs)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 计算全局 step 数量
global_step = epoch * len(train_loader) + i
# 记录 loss 数值到 TensorBoard
writer.add_scalar("Loss/train", loss.item(), global_step)
writer.close()
上述代码中,每次计算完 loss
后,调用 writer.add_scalar
将 loss
值保存到指定的日志目录中。
4. 启动 TensorBoard 并查看曲线
在终端中运行下面的命令,指定日志目录:
tensorboard --logdir=tensorboard_runs --port=6006
--logdir=tensorboard_runs
:指定日志存储目录,与SummaryWriter
中的目录匹配。--port=6006
:指定 TensorBoard 运行的端口(默认是 6006)。
运行后,终端会显示一个本地访问的 URL(例如:http://localhost:6006
)。打开这个 URL,在 TensorBoard 界面中选择 “Scalars” 标签页,就可以看到记录的 loss
曲线了。可以直观地观察训练过程中 loss
的变化情况,并对模型训练效果进行分析。
- 淡黄色部分(浅色波动曲线):表示
loss
在每个step
计算的原始值,这部分可能会有较大波动。 - 深黄色曲线(平滑后的曲线):表示
loss
的平滑趋势,可以看出整体的下降情况。
TF 版
要在 TensorBoard 中查看 loss 曲线,通常需要按照以下步骤操作:
记录 loss 数据
在训练过程中,利用 TensorFlow 的 tf.summary
API(或其他框架对应的日志记录方法)将 loss
值写入日志文件。例如,在 TensorFlow 2.x 中可以这样操作:
import tensorflow as tf
# 假设有一个自定义的训练循环
train_loss = tf.keras.metrics.Mean('train_loss', dtype=tf.float32)
summary_writer = tf.summary.create_file_writer("logs/fit")
for epoch in range(epochs):
for step, (x, y) in enumerate(train_dataset):
# 计算 loss ...
loss = compute_loss(model, x, y)
train_loss.update_state(loss)
# 每个step或每个epoch记录一次 loss
with summary_writer.as_default():
tf.summary.scalar('loss', train_loss.result(), step=step)
这样就会在 logs/fit
目录下生成日志文件,记录下训练过程中的 loss 数值。
启动 TensorBoard
在命令行中运行以下命令,指定日志目录:
tensorboard --logdir=logs/fit
命令执行后,终端会输出一个本地访问的 URL(如 http://localhost:6006)。
在浏览器中查看 loss 曲线
打开终端显示的 URL,进入 TensorBoard 界面。在左侧导航栏中点击 “Scalars” 标签页。此处会显示你在训练过程中记录的所有标量数据,包括 loss
曲线。
- 使用“Run”下拉菜单选择不同的运行(如果有多个日志目录)。
- 调整平滑参数来更清晰地查看趋势。