ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TF-Vision 数据增强与模型正则化完全指南:从 RandAugment、Mixup 到 Stochastic Depth

TF-Vision 数据增强与模型正则化完全指南:从 RandAugment、Mixup 到 Stochastic Depth TF-Vision 数据增强与模型正则化完全指南从 RandAugment、Mixup 到 Stochastic Depth【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models本文基于 TensorFlow Models 仓库 TF-Vision 模块的官方文档 aug_reg.md 编写系统讲解 TF-Vision 提供的两大类 SoTA 训练技巧面向图像分类、检测与分割的数据增强RandAugment/AutoAugment、Scale Jitter、Mixup/CutMix、Random Erasing以及模型正则化Stochastic Depth、Label Smoothing。读完本文后你可以直接在 TF-Vision 的 YAML 配置中启用这些技术并能对照源码理解每个参数的实际作用路径从而为自己的视觉训练任务定制增强与正则化方案。技术总览哪些方法、用在哪些任务上TF-Vision 内置了一批针对特定视觉任务调优过的增强与正则化方法默认方法如随机翻转、随机裁剪不在讨论范围内。各方法的适用场景汇总如下方法类别支持的任务/模型配置入口YAML 路径RandAugment / AutoAugment数据增强图像分类、视频动作分类、目标检测task.train_data.aug_typeImage scale jittering数据增强目标检测、语义分割task.train_data.parser.aug_scale_min/maxMixup / CutMix数据增强图像分类task.train_data.mixup_and_cutmixRandom erasing数据增强图像分类task.train_data.random_erasingStochastic depth模型正则化ResNet/ResNet-RS、SpineNet 系列、ViT、ResNet-RS-3Dtask.model.backbone.resnet.init_stochastic_depth_rateLabel smoothing模型正则化图像分类、视频动作分类task.losses.label_smoothing所有配置类都是基于dataclasses的hyperparams.Config子类通过 TF-Vision 的 YAML 实验配置体系注入到训练任务中默认值定义在 official/vision/configs/common.py底层算子实现集中在 official/vision/ops/augment.py 与 official/vision/ops/preprocess_ops.py。数据增强方法RandAugment 与 AutoAugmentRandAugment 与 AutoAugment 的思路是将多个常见的图像变换调整对比度、方向、颜色、亮度、锐度等组合成一个增强策略并在训练时随机选择使用哪些变换、以多强的强度使用。两者的区别在于策略来源——AutoAugment 使用搜索得到的固定策略族如policy_v0、detection_policy_v0而 RandAugment 则在统一操作集合上随机采样层数num_layers×强度magnitude的组合。TF-Vision 的这两种实现被设计为开箱即用、低开销广泛适用于多种数据集。TF-Vision 中对这两种增强的配置定义位于 official/vision/configs/common.pydataclasses.dataclass class RandAugment(hyperparams.Config): Configuration for RandAugment. num_layers: int 2 magnitude: float 10 cutout_const: float 40 translate_const: float 10 magnitude_std: float 0.0 prob_to_apply: Optional[float] None exclude_ops: List[str] dataclasses.field(default_factorylist) dataclasses.dataclass class AutoAugment(hyperparams.Config): Configuration for AutoAugment. augmentation_name: str v0 cutout_const: float 100 translate_const: float 250各参数含义结合 official/vision/ops/augment.py 的实现num_layersRandAugment 中串联随机增强操作的层数即从操作池里随机抽几个变换依次应用默认 2magnitude增强强度取值 0~10实现中通过level_to_arg()augment.py#L1796把 0~10 的强度映射为各操作的实际参数magnitude_std在此基础上引入标准差扰动默认 0 表示不扰动cutout_constCutout 操作填充方块的边长上限强度 10 时最大填充cutout_const像素translate_const平移操作在强度 10 时对应的最大平移像素数见_translate_level_to_arg()augment.py#L1683-L1688prob_to_apply整条策略的应用概率None表示每次都应用exclude_ops需要从随机池中排除的操作列表。启用 Random Erasing 时文档特别指出要在此排除Cutout因为两者功能重叠Cutout 填充随机方形区域augmentation_nameAutoAugment 的策略名。从 augment.py 中定义的策略族看可选值包括v0默认、reduced_cifar10、svhn、reduced_imagenet、detection、simple、vit、deit3等检测任务推荐使用detection对应detection_policy_v0。在 YAML 实验配置中增强通过Augmentation这一个 OneOf 配置选择定义见 common.py#L131-L144type取值randaug或autoaug。官方文档给出的 YAML 模板如下task: train_data: aug_type: type: randaug randaug: magnitude: 10 magnitude_std: 0.0 num_layers: 2从源码结构看这个配置的消费入口在图像分类数据管道 official/vision/dataloaders/classification_input.py当aug_type.type randaug时构造augment.RandAugmentautoaug时构造augment.AutoAugment带augmentation_name、cutout_const、translate_const随后挂到数据管道的后处理环节。分类任务的训练输入配置类在 official/vision/configs/image_classification.py 中声明了aug_type字段仓库内的多个 ImageNet 实验配置都以此方式启用了 RandAugment/AutoAugment。支持的任务图像分类、视频动作分类、目标检测。图像尺度抖动Image scale jittering尺度抖动从用户指定的区间[aug_scale_min, aug_scale_max]中随机抽取一个缩放因子大于 1.0 时对图像上采样小于 1.0 时下采样之后再随机裁剪或补零把缩放后的图像整理成目标尺寸。文档指出这是训练 SoTA 目标检测模型最有效的增强手段之一被 SpineNet、EfficientDet、Detection-RS、Copy-Paste 等检测工作广泛采用。TF-Vision 中的定义位于 RetinaNet 实验配置 official/vision/configs/retinanet.py 的Parser数据类dataclasses.dataclass class Parser(hyperparams.Config): aug_scale_min: float 1.0 aug_scale_max: float 1.0 # ... 其他字段默认值均为 1.0即不启用抖动。启用方式官方 YAML 模板task: train_data: parser: aug_scale_max: 2.0 aug_scale_min: 0.5从源码结构看参数实际消费在 official/vision/ops/preprocess_ops.py 的resize_and_crop_image_v2()Faster R-CNN 风格预处理中保持宽高比先把短边缩放到short_side若长边超出long_side则改按长边缩放只有当aug_scale_min/aug_scale_max偏离 1.0或是 Tensor时才进入random_jittering分支从区间内均匀采样random_scale乘到目标尺寸上若抖动后图像比目标尺寸大则在多余范围内随机取一个偏移量裁剪出目标区域否则左下角补零到padded_size同时返回image_info包含原始尺寸、目标尺寸、缩放因子、裁剪偏移下游用于把标注框同步变换。仓库里的检测实验配置给出了真实取值参考retinanet.py 中一个实验使用aug_scale_min0.8, aug_scale_max1.2而更激进的配置使用aug_scale_min0.1, aug_scale_max2.0可见取值幅度可随数据集和模型能力调整。支持的任务目标检测、语义分割。Mixup 与 CutMixMixup 对两张输入图像做随机凸组合img img_1 * a img_2 * (1.0 - a),其中a从 Beta 分布中采样标签以同样方式插值label label_1 * a label_2 * (1.0 - a).CutMix 同样组合两个训练样本但不用线性插值而是把img_2中一块随机矩形区域直接粘贴到img_1上。标签仍按 Mixup 的方式组合只是a改为补偿所粘贴矩形的面积占比。文档指出这两种方法是在有限标注数据下训练 Transformer 类图像模型ViT、DEIT的关键因素。配置定义在 official/vision/configs/common.pydataclasses.dataclass class MixupAndCutmix(hyperparams.Config): Configuration for MixupAndCutmix. mixup_alpha: float .8 cutmix_alpha: float 1. prob: float 1.0 switch_prob: float 0.5 label_smoothing: float 0.1mixup_alpha/cutmix_alphaBeta 分布的形状参数a ~ Beta(alpha, alpha)置 0 即关闭对应方法此时实现会自动把switch_prob置为 -1 或 1强制只走另一条路径见 augment.py#L2651-L2656prob对整批数据应用 Mixup/CutMix 的概率默认 1.0未触发时退化为仅做 label smoothingswitch_prob在 Mixup 与 CutMix 之间切换的概率默认 0.5 各半label_smoothing组合标签时叠加的平滑值默认 0.1。YAML 模板task: train_data: mixup_and_cutmix: cutmix_alpha: 1.0 label_smoothing: 0.1 mixup_alpha: 0.8 prob: 1.0 switch_prob: 0.5底层实现是 official/vision/ops/augment.py 中的MixupAndCutmix类几个值得了解的实现细节Beta 采样通过tf.random.gamma实现_sample_from_beta()分别采样两个 Gamma 变量再归一化augment.py#L2699-L2702保证整个流程可在 TF Graph 模式下运行CutMix 的矩形边长为sqrt(1 - lam) * 图像边长中心点随机且被插入的图像是 batch 内反向排列的另一张图tf.reverse(images, [0])Mixup 的img_2同理粘贴完成后lam会用实际矩形面积重新校准lam 1 - 矩形面积/图像面积保证标签权重与视觉占比一致该算子同时支持 4 维图像和 5 维视频输入因此除了图像分类也可用于视频动作分类任务official/vision/tasks/video_classification.py 同样消费params.mixup_and_cutmix在图像分类任务中它被注册为数据管道的postprocess_fnofficial/vision/tasks/image_classification.py也就是说增强发生在 batch 组装之后、进入模型之前。支持的任务图像分类。随机擦除Random erasingRandom erasing 采样随机矩形不同宽高比默认每张图一个再用随机高斯噪声覆盖矩形内的像素。文档特别强调两个前提其一随机擦除在输入图像被归一化为零均值、单位方差之后应用其二启用随机擦除时应在 RandAugment 的exclude_ops中排除 Cutout避免功能重复Cutout 是填充随机方形区域。配置定义在 official/vision/configs/common.pydataclasses.dataclass class RandomErasing(hyperparams.Config): Configuration for RandomErasing. probability: float 0.25 min_area: float 0.02 max_area: float 1 / 3 min_aspect: float 0.3 max_aspect: Optional[float] None min_count: int 1 max_count: int 1 trials: int 10probability应用擦除的概率默认 0.25min_area/max_area擦除矩形面积占图像面积的比例上下界默认 0.02 ~ 1/3min_aspect/max_aspect宽高比上下界max_aspect为None时取1 / min_aspect见实现 augment.py#L2551-L2553min_count/max_count擦除矩形个数区间默认恰好 1 个trials为满足面积/宽高比约束而重试采样矩形的最大次数默认 10。实现类RandomErasing位于 official/vision/ops/augment.py_erase()在一个tf.function中完成按概率触发、重试采样与噪声填充。YAML 模板官方文档给出的示例min_area/max_area为浮点数值task: train_data: random_erasing: min_area: 0.02 max_area: 0.33分类任务配置类在 official/vision/configs/image_classification.py 中以random_erasing: Optional[common.RandomErasing] None声明即不配置就不启用。支持的任务图像分类。模型正则化方法TF-Vision 还提供了一批 SoTA 模型正则化手段权重衰减、Dropout 等默认方法不在此列下面介绍文档覆盖的两种。Stochastic depth随机深度Stochastic depth 与残差网络互补概念上类似 dropout每个 mini-batch 随机挑选一组残差块直接旁路用恒等映射替代被旁路的概率随网络深度线性增长。文档指出该做法既能缩短训练时间又能改善泛化。支持的模型ResNet、ResNet-RSSpineNet、SpineNet-mobile、SpineNet-segVision TransformerViTResNet-RS-3D。YAML 模板task: model: backbone: resnet: init_stochastic_depth_rate: 0.2从源码结构看init_stochastic_depth_rate是各 backbone 配置的字段例如 official/vision/modeling/backbones/resnet.py 中的init_stochastic_depth_rate: float 0.0默认关闭。ResNet backbone 在构建每一组残差块时用 official/vision/modeling/layers/nn_layers.py 的get_stochastic_depth_rate(init_rate, i, n)计算第i个块共n个的旁路概率——这正是随深度线性增长的落地入口块接近 0最深层块接近init_rate。计算出的stochastic_depth_drop_rate再传入resnet_block()resnet.py#L328-L371在训练期以该概率把该块输出替换为输入残差本身。Label smoothing标签平滑Label smoothing 用于缓解模型过度自信overconfidence从而带来的过拟合不再使用 one-hot 标签而是给正确类别一个接近 1 的高值x把(1 - x)均分给其余类别。支持的模型/任务图像分类、视频动作分类。YAML 模板task: losses: label_smoothing: 0.1从源码结构看label_smoothing是各任务 Losses 配置的通用字段例如图像分类的损失配置在 official/vision/configs/image_classification.py 中定义label_smoothing: float 0.0默认关闭仓库内置的 ImageNet 训练实验普遍配置为 0.1。此外前面介绍的MixupAndCutmix内部也带一个独立的label_smoothing参数见 augment.py 的_smooth_labels()用于对组合标签做平滑与任务级task.losses.label_smoothing作用点不同配置时不要混淆。实践要点与组合建议结合文档与源码实际使用时可以把握以下原则按任务选方法分类任务可叠加aug_typeRandAugment/AutoAugmentmixup_and_cutmixrandom_erasingtask.losses.label_smoothing检测任务的核心是parser.aug_scale_min/max尺度抖动配合aug_type: autoaugaugmentation_name: detection或 RandAugmentViT 类模型在标注数据有限时Mixup/CutMix 尤为关键。注意相互排斥项启用 Random erasing 时按文档要求在 RandAugment 中排除 Cutoutexclude_ops避免双重遮挡增强。强度参数从保守值起步RandAugment 默认num_layers2, magnitude10Mixup 默认mixup_alpha0.8, cutmix_alpha1.0scale jitter 参考仓库实验从0.8~1.2到0.1~2.0的幅度stochastic depth 常用init_stochastic_depth_rate: 0.2。所有默认值都定义在 official/vision/configs/common.py 与各任务配置文件中可直接作为调参基线。确认参数是否真正生效这些配置的消费点分别在数据加载层classification_input.py、检测解析层preprocess_ops.py、任务层tasks/image_classification.py和 backbone 构建层backbones/resnet.py排查配了没生效的问题时可沿这条链路定位。【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表