Training Data
训练数据是模型用来学习权重的示例集合。了解它与验证数据和测试数据的区别,以及为什么标签质量与数据量同样重要。
训练数据是机器学习模型学习所用的样例集合。训练期间,优化器会反复调整模型权重,以降低模型在这些样例上的误差,因此这些样例决定了模型能学到什么。在监督学习中,每个样例都将输入与正确答案配对,例如一张街景照片,其中每辆汽车和每位行人都标有边界框和类别名称。自监督学习和无监督学习则使用未标注的原始输入进行训练。训练集是训练数据的同义词;在大多数项目中,它是可用数据中占比最大的部分,通常占 70% 到 80%。
模型如何使用训练数据#
模型会分批读取训练数据。对于每个批次,模型都会进行预测;损失函数会衡量预测与标签之间的差异;反向传播会计算每个权重对误差的贡献;优化器则微调权重以减小误差。完整遍历一次训练集称为一个轮次(epoch),训练通常会进行数十到数百轮。
由于模型针对这些特定样例进行了优化,因此它在这些样例上的分数会高估其在新数据上的表现。两个留出数据集可以纠正这一问题。验证数据会在开发过程中进行评估,用于选择超参数和检查点;测试数据则只在最后评估一次,用来估计模型在真实场景中的表现。训练分数与验证分数之间的差距较大,表明出现了过拟合:模型记住了训练样例,而没有学到能够泛化的规律。两者分数都很低,则表明出现了欠拟合。不同数据集划分不能共享图像:如果同一段视频的近似重复帧,或同一患者的扫描图像同时出现在不同划分中,就会造成数据泄漏,使所有留出数据集的分数虚高。
数量、质量与覆盖范围#
训练集的三个属性决定了模型的泛化能力:
- 数量: 样例越多越有帮助,但收益会逐渐递减。通过迁移学习从预训练模型开始训练,可以减少新任务所需的标注样例数量。
- 质量: 每个错误、缺失或绘制不一致的标签,都会教给模型错误信息。一致的数据标注规范与标签数量同样重要。
- 覆盖范围:样本必须覆盖模型将面对的各种情况,例如光照、天气、摄像头角度、背景和罕见类别。只在日间图像上训练的检测器到了夜间就会失效;如果数据缺口涉及人口统计特征,例如人脸数据集中缺少某些肤色,就会形成数据集偏差。
下面的 scikit-learn 脚本使用内置的手写数字数据集和不同规模的训练集训练同一个分类器,并在一个固定的测试集划分上评估每个模型:
import numpy as np
from sklearn.datasets import load_digits
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 1,797 labeled 8x8 digit images; hold out 30% to score every model
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
# Reassign 30% of the training labels at random to simulate careless labeling
rng = np.random.default_rng(0)
y_noisy = y_train.copy()
flip = rng.random(len(y_train)) < 0.3
y_noisy[flip] = rng.integers(0, 10, flip.sum())
# Train the same model on three different training sets
for name, n, labels in [("50 clean", 50, y_train), ("1,257 clean", 1257, y_train), ("1,257 noisy", 1257, y_noisy)]:
model = LogisticRegression(max_iter=5000).fit(X_train[:n], labels[:n])
print(f"{name}: test accuracy {model.score(X_test, y_test):.3f}")将干净训练集从 50 张图像扩大到 1,257 张图像后,测试准确率从 0.863 提升到 0.961。噪声训练中,1,257 个标签里有 315 个(25%)错误,模型得分为 0.861,并不比使用 50 张干净图像训练的模型更好。
构建训练集#
团队会从公开数据集、自有摄像头和日志中收集训练数据,并且越来越多地使用合成数据。公开基准数据集提供了良好的起点:COCO 数据集提供了 118,287 张用于检测、分割和图像描述的训练图像。接下来,原始数据会经过数据清洗,移除重复项、损坏文件和偏离目标的图像,然后进行标注与审核。数据增强会在训练期间通过翻转、裁剪、颜色变化和拼图等方式增加数据多样性,但它只能重新组合已有数据,因此仍然需要拍摄缺失场景。
Ultralytics YOLO 会从数据集 YAML 文件的 train 路径读取训练数据,并将每张图像与对应的 .txt 标签文件配对;每个标签文件按对象逐行记录类别索引、框中心坐标、宽度和高度,并根据图像尺寸进行归一化。所有数据集划分都使用相同的 YOLO 数据集格式,因此要重新平衡各划分,就需要在文件夹之间移动图像及其标签文件。
from ultralytics import YOLO
# 加载预训练的 YOLO26 nano 模型
model = YOLO("yolo26n.pt")
# coco8.yaml 列出训练图像 (train: images/train) 和验证图像 (val: images/val)
results = model.train(data="coco8.yaml", epochs=5)YOLO26模型会使用COCO8的四张训练图像进行微调。COCO8 是一个小型样本,用于检查训练流水线是否能端到端运行。
训练数据与相关术语#
- 验证数据: 留出数据集,用于指导开发过程中的决策,例如何时停止训练。模型不会根据验证数据更新权重。
- 测试数据: 只在最后评估一次的留出数据集,因此其评估结果可以无偏地估计模型在新数据上的表现。
- 真实标注: 附加到样例上的正确答案。在监督学习中,训练数据包含真实标注,但每个数据集划分都需要真实标注才能进行评估。
- 黄金数据集: 一组规模较小、经专家审核的数据,可作为可信参考,用于评估和检查标注人员的质量。
- 基准数据集: 一个具有固定划分的公开数据集,用于比较模型。其训练集通常也用作预训练数据,而留出集则作为评分基准;例如,许多检测论文都会报告在包含 5,000 张图像的 COCO val2017 划分上取得的 mAP。










