Epoch
一个 epoch 指模型完整遍历一次训练数据。了解 epoch 与批次和迭代的关系,以及应该训练多少个 epoch。
一个 epoch 指机器学习模型完整遍历整个训练数据集一次。在一个 epoch 中,每个训练样本都会且仅会对模型权重的更新产生一次影响。深度学习模型很少能通过一次遍历学到足够的内容,因此训练通常会进行许多个 epoch;随着网络不断改进预测结果,训练数据上的误差通常会逐轮下降。
Epoch、批次与迭代#
三个术语描述了训练过程的结构,每个术语都嵌套在前一个术语之中:
- Epoch:完整遍历一次训练数据集。
- 批次:在一个步骤中一同处理的一组样本。数据集很少能一次性放入 GPU内存,因此每个 epoch 都会拆分成多个批次,通常会先打乱数据。
- 迭代:更新一次权重;在一个批次上计算损失函数后,梯度会通过反向传播传回网络。“Step”是它的同义词。
每个 epoch 的迭代次数等于数据集大小除以批次大小,结果向上取整。一个包含 1,000 张图像、批次大小为 100 的数据集,每个 epoch 需要 10 次迭代,因此 50 个 epoch 会产生 500 次权重更新。在 PyTorch中,这种结构表现为两个嵌套循环:外层循环遍历 epoch,内层循环遍历由 DataLoader提供的批次。
import torch
from torch.utils.data import DataLoader, TensorDataset
torch.manual_seed(0)
# 1,000 noisy samples of the line y = 3x + 2, served in shuffled batches of 100
x = torch.rand(1000, 1)
y = 3 * x + 2 + 0.1 * torch.randn(1000, 1)
loader = DataLoader(TensorDataset(x, y), batch_size=100, shuffle=True)
model = torch.nn.Linear(1, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.5)
for epoch in range(5): # one epoch = one full pass over all 1,000 samples
for xb, yb in loader: # 1,000 / 100 = 10 iterations per epoch
loss = torch.nn.functional.mse_loss(model(xb), yb)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"Epoch {epoch + 1}: {len(loader)} iterations, last batch loss {loss.item():.4f}")每个 epoch 都会运行 10 次迭代;随着模型逐渐拟合真实直线,最后一个批次的损失从第一个 epoch 后的 0.1096 降至第五个 epoch 后的 0.0088。训练使用数据增强时,每个 epoch 中的每张图像都会经过全新的变换,因此后续 epoch 会增加多样性,而不是重复完全相同的图像。
如何选择 epoch 数量#
epoch 数量是超参数调优中的主要设置之一。epoch 太少会导致模型欠拟合,在训练数据和验证数据上的误差都很高。epoch 太多则可能导致过拟合:训练损失持续下降,但验证分数停滞或下降,因为模型开始记忆训练样本。合适的数量取决于数据集规模、模型大小、学习率调度,以及训练是否通过迁移学习从预训练权重开始。数据规模也会影响选择:小型视觉数据集通常要训练数百个 epoch,而大型语言模型处理的大部分数据不到一遍;GPT-3在经过筛选的 Common Crawl 数据上完成了 0.44 个 epoch。
早停可以自动决定何时停止。模型每个 epoch 结束后都会在验证数据上评估,并保留最佳检查点;如果验证分数连续达到设定数量的 epoch 没有提升,训练就会结束,这个设定数量称为 patience。
基于 epoch 的训练调度#
除了停止时间之外,许多训练设置也会按 epoch 调整,例如学习率预热和衰减,或数据增强强度。在 Ultralytics YOLO 训练中,epochs 和 patience 的默认值都是 100;学习率会在前 3 个 epoch 中预热,而马赛克增强会在最后 10 个 epoch 关闭(close_mosaic=10),让模型最终接触到外观更接近真实输入的图像。YOLO26 训练方案展示了训练轮数会随模型大小变化多少:在 Objects365上预训练 150 个 epoch 后,针对 COCO的微调对 YOLO26n 进行了 245 个 epoch,对 YOLO26x 则进行了 40 个 epoch。
from ultralytics import YOLO
# 加载预训练的 YOLO26n 模型
model = YOLO("yolo26n.pt")
# 训练 50 个 epoch:完整遍历 COCO8 训练图像 50 次
results = model.train(data="coco8.yaml", epochs=50, imgsz=640)在这次运行中,训练器会在每个 epoch 后验证 YOLO26模型,每次都会覆盖 last.pt;当验证适应度(检测任务中为 mAP50-95)达到新高时,就会保存 best.pt。










