深度学习数据管道与预处理
划分、拟合训练统计、变换、组批、传输和输入模型的完整链路。
学习目标
- 尾批使批均值平均失真
- 验证集可以重新计算自己的标准化均值吗?
- 说明:统计权重必须匹配损失定义;按样本和按有效 token 的平均不能混用。
为什么需要这个概念
数据管道是从样本读取到模型输入的完整变换链,包含划分、清洗、预处理、增强、组批和设备迁移。训练、验证与推理应共享兼容契约。
学习前需要掌握
背景与问题
同一模型训练与部署采用不同数值范围,或标准化统计混入验证数据,都会使评估失真。数据管道需要同时维护数值、形状和划分来源。
概念定义
数据管道是从样本读取到模型输入的完整变换链,包含划分、清洗、预处理、增强、组批和设备迁移。训练、验证与推理应共享兼容契约。
直观理解
模型不是只吃一张图片,而是吃“按某种规则加工后的张量”。保存权重却丢失加工规则,等于只留下半个系统。
核心原理
均值、标准差、词表和缺失值填补等数据驱动规则只能在训练部分拟合,再固定用于验证与测试。先全量拟合再划分,会让未来数据影响训练表示,形成泄漏。
训练增强可随机,但必须保持标签语义;验证和推理通常使用确定性变换。图像与框、mask 必须同步变换,序列标签也要与 token 对齐。预训练权重还应使用配套的尺寸和归一化。
计算 epoch 均值损失时,若 criterion 返回批内均值,应乘批样本数再累计。序列和分割若按有效 token 或像素定义目标,权重应改为对应有效数量,不能机械地都乘 batch size。
数学表达
核心公式
数据管道是从样本读取到模型输入的完整变换链,包含划分、清洗、预处理、增强、组批和设备迁移。训练、验证与推理应共享兼容契约。
变量含义
μ_train训练均值σ_train训练标准差
计算步骤
- 1简单平均批均值得到 11/3。
- 2按样本数加权为 (2×1+2×1+1×9)/5。
代码对应位置
示例 1尾批使批均值平均失真的最小验证:使用完整构造输入核对尾批使批均值平均失真,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
μ_train | 训练均值 |
σ_train | 训练标准差 |
完整数值示例
尾批使批均值平均失真
已知条件
- 五条样本损失为 1、1、1、1、9
- batch_size=2,批均值为 1、1、9
计算步骤
- 简单平均批均值得到 11/3。
- 按样本数加权为 (2×1+2×1+1×9)/5。
计算结果
正确样本平均为 2.6,等权平均批均值则约为 3.6667。
处理前后对比
- 统计权重必须匹配损失定义;按样本和按有效 token 的平均不能混用。
尾批使批均值平均失真
尾批只有一条,若与两条样本的批次等权,就放大了它的影响。代码构造平方误差恰为这五个值,只演示日志归一化,不训练模型。
若任务按 token 求平均,最后一批可能虽样本少却 token 多。此时应记录 loss sum 与有效 token count,依据目标定义计算,而不是照搬本例样本数。
计算与实现步骤
- 简单平均批均值得到 11/3。
- 按样本数加权为 (2×1+2×1+1×9)/5。
代码实现
示例 1
尾批使批均值平均失真的最小验证
example_01.py用途:使用完整构造输入核对尾批使批均值平均失真,输出只表示本例计算。
import torch
from torch.utils.data import DataLoader, TensorDataset
error = torch.tensor([1., 1., 1., 1., 3.])
loader = DataLoader(TensorDataset(error), batch_size=2)
total, count, batch_means = 0., 0, []
for (e,) in loader:
loss = e.square().mean()
total += loss.item() * len(e)
count += len(e)
batch_means.append(loss.item())
print(f"weighted={total / count:.4f} mean_of_batches={sum(batch_means) / len(batch_means):.4f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对尾批使批均值平均失真,输出只表示本例计算。
mean- 训练特征逐列均值。
loss- 当前预测与目标之间的损失值。
Step 1 · 1–11 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
from torch.utils.data import DataLoader, TensorDataset
error = torch.tensor([1., 1., 1., 1., 3.])
loader = DataLoader(TensorDataset(error), batch_size=2)
total, count, batch_means = 0., 0, []
for (e,) in loader:
loss = e.square().mean()
total += loss.item() * len(e)
count += len(e)
batch_means.append(loss.item())
print(f"weighted={total / count:.4f} mean_of_batches={sum(batch_means) / len(batch_means):.4f}")代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
平方误差代码对应均方损失。
预期输出或运行结果
weighted=2.6000 mean_of_batches=3.6667
常见错误 · 5 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 全数据标准化
- 验证随机增强
- 直接平均 batch loss
- 通道/值域错
实际应用
- 建立一致的训练与推理预处理
- 正确汇总不等长批次的损失
常见错误
- 全数据标准化
- 验证随机增强
- 直接平均 batch loss
- 通道/值域错
常见问题
验证集可以重新计算自己的标准化均值吗?
通常不可以。部署时应应用训练拟合的规则;单独重新拟合会改变评估契约,也可能使用本不应知道的评估分布信息。
这个示例能说明什么边界?
统计权重必须匹配损失定义;按样本和按有效 token 的平均不能混用。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。