《PyTorch》Transforms:数据增强不是锦上添花,是训练基本功
13 / 13 章
“模型不是直接学习真实世界,模型学习的是被 Transforms 处理后的 Tensor 世界。” 上一章讲了 Dataset 和 DataLoader。Dataset 负责取样本,DataLoader 负责拼 batch。中间还缺一个关键
“模型不是直接学习真实世界,模型学习的是被 Transforms 处理后的 Tensor 世界。”
上一章讲了 Dataset 和 DataLoader。Dataset 负责取样本,DataLoader 负责拼 batch。中间还缺一个关键环节:Transforms。
它看起来只是 Resize、Crop、Normalize、Flip。实际上,它决定了模型看到什么样的数据,也决定了模型能不能学到稳定特征。
数据增强不是为了把图片变花哨。它的目标很朴素:让模型不要死记硬背某一张图,而是学会图像背后的本质。
1. Transforms 到底解决什么问题
原始数据不适合直接喂给模型。图片可能大小不一,颜色范围不同,通道顺序不同;检测任务还有框,分割任务还有 mask,视频任务还有时间维度。
Transforms 做两类事:第一类是预处理,目的是把数据变规范;第二类是数据增强,目的是让模型见到更多合理变化。
• 预处理:Resize、CenterCrop、ToImage、ToDtype、Normalize。它们让输入形状、类型、范围稳定。
• 数据增强:RandomResizedCrop、RandomHorizontalFlip、ColorJitter、RandomErasing、MixUp、CutMix。它们让训练样本产生合理扰动。
• 任务同步:检测框、分割 mask、关键点、视频帧必须和图片一起变。图片动了,标签也要动。
“预处理负责“能不能训练”,数据增强负责“能不能泛化”。”
2. 为什么数据增强能提升泛化
模型很容易走捷径。训练集中猫都在画面中间,它可能学到“中间有一团纹理就是猫”。训练集中背景都很亮,它可能学到“亮背景就是某类”。
数据增强就是打断这种捷径。随机裁剪让目标位置变化,水平翻转让方向变化,颜色扰动让光照变化,随机擦除让局部信息缺失。
这些变化不是乱来。它们必须满足一个前提:标签仍然正确。猫翻转后还是猫;车裁掉一部分后仍然是车;但把 6 翻转成 9,就可能不是同一个标签。
• 增强要符合业务世界。医学影像、遥感图像、数字识别、工业质检,允许的增强都不一样。
• 增强不是越多越好。增强太轻,模型容易过拟合;增强太重,标签语义会被破坏。
• 增强强度要和验证集表现一起看,而不是凭感觉堆。
3. 训练集和验证集必须用不同 Transform
训练集要随机。每个 epoch、每次读取,样本都可以略有不同。这样模型被迫学习稳定特征。
验证集不能随机。验证集是考试,不是训练。如果验证阶段也随机裁剪、随机翻转,指标会来回跳,根本无法判断模型有没有进步。
正确做法很简单:训练集使用随机增强;验证集和测试集只做 Resize、CenterCrop、ToDtype、Normalize 等确定性步骤。
4. 为什么推荐使用 torchvision.transforms.v2
老版本 transforms 主要围绕图像分类使用。图像分类只有 image 和 label,处理起来简单。
但真实项目经常不是这么简单。目标检测有 bounding boxes,语义分割有 mask,姿态估计有 keypoints,视频任务有 frames。只变图片,不变标注,就是灾难。
v2 的价值在这里:它不仅能处理图片,还能处理 tensor、PIL image、video、bounding boxes、mask、keypoints,并支持 dict、list、tuple 等任意输入结构。
• 图像分类:重点是尺寸、颜色、归一化。
• 目标检测:图片怎么裁,框也要怎么变。
• 语义分割:图片怎么变,mask 也要跟着变,但 mask 不能当普通图片归一化。
• 视频任务:同一段视频的帧要保持时间一致性,不能每帧乱抽随机参数。
5. 一条推荐的训练 Transform 管线
官方文档给出的思路很清楚:优先使用 v2,尽量使用 Tensor 后端;Resize/Crop 阶段保持 uint8;Normalize 前再转 float。
原因也不复杂。几何变换通常处理 uint8 更划算;Normalize 是数值标准化,需要 float 输入。顺序不对,可能影响速度,也可能影响输入分布。
这条管线背后的原则是:先把样本转成统一表示,再做随机几何增强,再做数值类型转换,最后做归一化。
6. Normalize:最容易被忽略,却最影响效果
Normalize 的公式非常简单:每个通道减去均值,再除以标准差。
但它的影响很大。尤其是使用预训练模型时,如果 mean/std 不匹配,输入分布就和预训练阶段不一致,模型效果可能明显下降。
• Normalize 不支持 PIL Image,应该在 Tensor + float 输入之后使用。
• ImageNet 预训练模型通常使用对应权重说明里的 mean/std。
• 自建业务数据差异很大时,可以统计训练集自己的 mean/std。
• Mask、类别标签、检测框不要 Normalize。它们不是普通图像像素。
7. Compose 只是顺序执行吗
从使用者角度看,Compose 就是把多个 Transform 串起来。
从源码角度看,v2.Compose 的 forward 会按顺序调用每一个 transform。每次调用后,把输出作为下一个 transform 的输入。
outputs = transform(*inputs) |
这就是管线的本质:上一步的输出,就是下一步的输入。
8. Transform.forward 真正做了什么
v2 Transform 的设计比 v1 更像一个小型分发系统。它不是拿到输入就硬改,而是先把复杂输入结构拆平,再判断哪些对象需要被变换。
它的大致流程是:
• 第一步:tree_flatten,把 dict、tuple、list 等输入结构展开。
• 第二步:check_inputs,检查输入是否合法。
• 第三步:_needs_transform_list,判断哪些对象需要变换,哪些对象原样通过。
• 第四步:make_params,为随机变换抽取参数。
• 第五步:transform,对目标对象执行变换。
• 第六步:tree_unflatten,把输出恢复成原来的结构。
这就是为什么 v2 能处理复杂样本。一个样本可以同时包含 image、boxes、mask、label。Transform 会尽量保持结构不变,只改该改的对象。
举个逻辑例子:分类样本里只有 image 需要增强,label 原样返回;检测样本里 image 和 boxes 都要同步增强;分割样本里 image 和 mask 要同步增强,但 mask 不能走 Normalize。
9. 随机增强:随机的是参数,不是逻辑
RandomResizedCrop 不是每次随便裁。它会先根据 scale 和 ratio 抽一个裁剪区域,再把这个区域 resize 到目标尺寸。
RandomHorizontalFlip 也不是每次都翻。它会根据概率 p 判断是否执行。
重点在于:同一次 transform 调用中,图片、框、mask 应该共享同一组随机参数。否则图像和标注就会错位。
10. Functionals 和 Kernels:底层真正干活的地方
Transform 类负责组织流程。Functional 负责具体操作。Kernel 负责根据输入类型选择真正实现。
这和 torch.nn 很像:nn.Linear 是模块类,F.linear 是函数入口,底层再进入算子实现。Transforms 也是同样的思想。
以 Normalize 为例,Normalize.transform 不自己写所有计算逻辑,而是调用 F.normalize。F.normalize 再根据输入类型选择对应 kernel。
• PIL 图像走 PIL 相关实现。
• 普通 Tensor 走 Tensor 实现。
• tv_tensors.Image、BoundingBoxes、Mask、Video 走各自类型对应的实现。
• 不需要变换的字段原样通过。
“类负责管流程,functional 负责管动作,kernel 负责管类型。”
11. 性能问题:Transforms 也会拖慢训练
很多人以为训练慢就是模型慢。实际排查时,经常发现 GPU 利用率很低,原因是数据管线太慢。
图片读取、解码、Resize、随机裁剪、颜色扰动,都可能发生在 CPU 上。如果 DataLoader worker 不够,GPU 就会一直等数据。
• 优先使用 v2 transforms。新特性和优化会主要进入 v2。
• 训练中尽量使用 Tensor 后端,减少 PIL 来回转换。
• Resize/Crop 阶段可保持 uint8,Normalize 前再转 float。
• 配合 DataLoader 的 num_workers,让 CPU 提前准备 batch。
• 追极致性能时,要关注 stride 和 memory format。
12. 常见坑:增强写错,模型会悄悄学歪
Transforms 的问题很隐蔽。它不像语法错误那样马上报错。很多时候,训练能跑,loss 也下降,但模型效果就是差。
判断增强是否合理,有一个简单标准:人看增强后的样本,是否还能确认标签是对的。
如果人都觉得标签变了,模型只会更迷糊。
13. 总结
• Transforms 是数据进入模型前的加工车间。
• 预处理让输入规范,数据增强让模型泛化。
• 训练集可以随机,验证/测试集必须稳定。
• v2 transforms 适合复杂任务,可以同步处理 image、box、mask、video。
• 源码主线是 Dataset → Compose → Transform.forward → make_params → transform → functional → kernel。
• Normalize、dtype、range、mask、box 同步,是最容易踩坑的地方。
“写 PyTorch,不只是写模型。数据怎么进来,模型就怎么学习。”
相关推荐

阿里发布Qwen-Robot系列具身大模型:三大模型协同攻克异构机器人适配痛点
6月16日,阿里巴巴正式发布千问具身智能大模型Qwen-Robot系列,该系列由VLA操作模型Qwen-RobotManip、VLN移动模型Qwen-RobotNav以及世界模型Qwen-RobotWorld三大核心矩阵组成。 这一战略动作标志着大厂在具身智能基础模型领域的布局进一步深化,实现了机器人操控、导航与物理规律推理的协同运转。 针对传统VLA模型换

斥资 36 亿美元,Salesforce 吞并 AI 客服平台 Fin
人工智能赛道又迎来了重量级并购。近日,企业服务巨头 Salesforce 正式宣布,将以36亿美元的价格收购 AI 客户服务平台 Fin 。此次收购不仅是 Salesforce 在智能服务领域的一次重大布局,也标志着其对进一步优化企业自动化能力的决心。 Fin 的前身为知名互动平台 Intercom,凭借其强大的 AI 智能体技术在行业内崭露头角。该平台能够
大模型应用日志体系、Callback 源码链路、Trace 复盘、企业级落地
开篇:AI 应用没有日志,就是黑盒 大模型应用最怕的不是慢,也不是贵。最怕的是:用户说答案错了,你不知道错在哪。 普通业务系统出了问题,看接口日志、SQL 日志、异常堆栈,大多能定位。但大模型应用不一样。一次回答背后可能经过问题改写、意图识
《LangChain 系列》LangSmith:如何调试、追踪、评测一个 Agent?
开篇:Agent 能跑起来,不等于能上线 前面我们已经讲了 Tools、Agent、Memory、LangGraph、Middleware 和 Streaming。到这里,很多人会以为:Agent 跑起来了,项目就完成了。 错。真正难的地方

溢价数倍势在必得,高通正洽谈最高百亿美元收购 AI 芯片初创公司
据海外知名媒体披露,全球芯片巨头高通公司目前正在展开一场重磅收购谈判,其目标直指人工智能芯片设计领域的明星初创企业 Tenstorrent。这笔潜在的交易如果最终达成,将成为近年来半导体行业瞩目的焦点事件。 巨额溢价彰显势在必得 知情人士透露,高通为本次收购开出了极为丰厚的条件,双方商讨的收购对价区间预计在 80 亿至 100 亿美元之间。相较于 Tenst

加码国产算力:字节跳动拟采购 5 万颗AI芯片,国产GPU阵营再添新主力
随着AI大模型用户规模的持续扩张,算力基础设施的自主可控正成为各大科技企业的战略重心。 6 月 15 日,有消息传出,字节跳动目前正与国内高性能计算厂商天数智芯进行深度洽谈,计划大规模采购AI芯片。 根据目前掌握的信息,此次采购规模预计达到 5 万颗。这批芯片交付后,将被主要部署于推理任务场景,为字节跳动旗下AI聊天机器人“豆包”的持续迭代与用户增长提供强有
阅读补充
一句话看懂
“模型不是直接学习真实世界,模型学习的是被 Transforms 处理后的 Tensor 世界。” 上一章讲了 Data
事件背景
这篇内容围绕“PyTorch”展开,热闻岛基于公开信息整理事件背景、主要进展与可继续关注的方向。
事件时间线
发布
相关信息进入公开传播
更新
热闻岛对内容进行整理与补充。
看点
- · PyTorch的最新进展是什么
- · 相关信息对用户或行业会带来哪些影响
- · 后续是否会有新的回应或处理结果
后续关注
- · 后续官方回应或权威通报
- · 相关主体的进一步说明
- · 事件对普通用户和平台传播的持续影响
免责声明:本文仅代表作者观点,不构成投资建议、法律建议、医疗建议。财经类内容尤其需要注意风险;爆料类信息请以权威通报为准。
评论 (0)
登录后即可发表评论
去登录