如何用 train.py 的 NaFlex 参数训练可变输入尺寸 ViT 并在 validate.py 中验证?

发布时间:2026/9/13 14:51:07
如何用 train.py 的 NaFlex 参数训练可变输入尺寸 ViT 并在 validate.py 中验证? 如何用 train.py 的 NaFlex 参数训练可变输入尺寸 ViT 并在 validate.py 中验证【免费下载链接】pytorch-image-modelsThe largest collection of PyTorch image encoders / backbones. Including train, eval, inference, export scripts, and pretrained weights -- ResNet, ResNeXT, EfficientNet, NFNet, Vision Transformer (ViT), MobileNetV4, MobileNet-V3 V2, RegNet, DPN, CSPNet, Swin Transformer, MaxViT, CoAtNet, ConvNeXt, and more项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-image-models在 pytorch-image-modelstimm中训练 Vision Transformer 时如果希望同一个 batch 里的图像可以有不同宽高比、不同分辨率而不是全部缩放到固定尺寸就需要启用 NaFlex 数据管线。README 的更新日志June 5, 2025 条目说明NaFlexVit 模型支持 NaFlex 可变宽高比、可变分辨率输入项目提供了一个完整的 NaFlex 数据管线allows training / fine-tuning / evaluating with variable aspect / size images在train.py和validate.py中通过--naflex-loader参数开启且必须与 NaFlex 兼容模型一起使用。本文的操作路径是用 train.py 的 NaFlex 参数训练或微调一个可变输入尺寸的 ViT确认 NaFlex 模式已生效再用 validate.py 在同一模型上输出验证集指标。哪些模型可以配合 --naflex-loader 使用--naflex-loader要求模型是 NaFlex 兼容的有两条文档明确支持的路线原生 NaFlexVit 模型模型定义在 timm/models/naflexvit.py。README 列出了三个带预训练权重的原生 checkpointImageNet-1k 训练评估序列长度 576naflexvit_base_patch16_par_gap.e300_s576_in1ktop-1 83.67naflexvit_base_patch16_parfac_gap.e300_s576_in1ktop-1 83.63naflexvit_base_patch16_gap.e300_s576_in1ktop-1 83.50此外还有未带权重的定义如naflexvit_base_patch16_map.untrained、naflexvit_so150m2_patch16_reg1_gap.untrained以及 SigLIP 2 变体naflexvit_base_patch16_siglip.v2_webli、naflexvit_so400m_patch16_siglip.v2_webli。经典 ViT / EVA 系模型以 NaFlexVit 方式加载README 说明vision_transformer.py中现有 ViT 模型可以在创建时加use_naflexTrue加载进 NaFlexVit命令行对应写法是--model-kwargs use_naflexTrue。README 给出的官方示例命令正是走这条路用vit_base_patch16_224在 NaFlex 数据管线下评估。数据目录方面hfdocs/source/training_script.mdx 对训练脚本的要求是--data-dir指向包含train和validation两个子文件夹的根目录而 validate.py 的--data-dir直接指向验证图像所在文件夹。train.py 的 NaFlex 参数与训练命令train.py 中 NaFlex 相关参数源码中的定义与默认值如下参数类型 / 默认值用途按源码 help 文本--naflex-loaderflag默认 False启用 NaFlex loader要求 NaFlex 兼容模型--naflex-train-seq-lensint 列表默认128 256 576 784 1024训练时每个 batch 随机从中选取的序列长度--naflex-max-seq-lenint默认 576NaFlex loader 的固定最大序列长度用于验证--naflex-patch-sizesint 列表默认 None可变 patch size 训练的 patch 尺寸列表如8 12 16 24 32--naflex-patch-size-probsfloat 列表默认 None各 patch size 的概率必须与 patch sizes 等长和为 1.0不指定则均匀分布--naflex-loss-scalenone/sqrt/linear默认linear按 batch size 缩放 loss梯度的模式--naflex-patchify-channels-firstflag默认 False输出 C-P-Pchannels-first布局的 patch用于消费 HF/Gemma4 风格 C-P-P patch 的模型--naflex-train-seq-lens的作用按 README 描述是指定训练期间每个 batch 随机选取的序列长度--naflex-max-seq-len则是验证时的目标序列长度。由于 NaFlex 加载器会随每个序列长度改变 batch size所以--naflex-loss-scale用于相对 batch size 做 loss 缩放。最短可行主路径——单卡微调一个原生 NaFlexViTpython train.py --data-dir /data/imagenet \ --model naflexvit_base_patch16_gap.e300_s576_in1k \ --naflex-loader \ --naflex-train-seq-lens 128 256 576 784 1024 \ --naflex-max-seq-len 576 \ --epochs 按你的训练配方 --sched cosine --warmup-epochs 按你的训练配方 \ --lr 按你的训练配方 --batch-size 按你的训练配方 --amp -j 8其中--data-dir指向含train/validation子目录的根目录训练脚本的要求...是读者必须自己填写的训练超参数文档没有给出 NaFlex ViT 的参考训练配方training_script.mdx 里不同模型族示例的--epochs/--lr/--batch-size组合各不相同例如 SE-ResNet34 示例用--epochs 150 --warmup-epochs 5 --lr 0.4 --batch-size 256 --amp请按自己模型族的训练配方选择。如果你训练的是经典 ViT 而非原生 NaFlexVit则把--model换成经典模型名并追加--model-kwargs use_naflexTrue例如--model vit_base_patch16_224 --model-kwargs use_naflexTrue。可选分支可变 patch size 训练README 指出追加--model-kwargs enable_patch_interpolatorTrue --naflex-patch-sizes 12 16 24可以启用每 batch 随机 patch size 选择带插值。此时如果还想控制各 patch size 的选取概率用--naflex-patch-size-probs长度必须与--naflex-patch-sizes相同。如何确认训练确实跑在 NaFlex 模式train.py 源码中NaFlex 分支在首次构建 loader 时会输出日志主进程Using NaFlex loader单 patch size 模式下Using model patch size: (h, w)可变 patch size 模式下Using variable patch sizes: [...]这些日志是判断 NaFlex 数据管线已接入的直接依据。此外进入 NaFlex 模式后训练循环会断言输入是 dictbatch 内是 patchified 的字典张量而非固定尺寸图像张量loss 按--naflex-loss-scale指定的模式缩放分布式训练时还会对各 rank 不同的 batch size 做梯度缩放见 train.py 中train_epoch的naflex_mode分支。train.py 内部的周期性验证也走 NaFlex loader它用模型的 native patch size 和--naflex-max-seq-len构建验证 loader所以训练过程中的验证指标与最终的独立验证应基于同一目标序列长度。在 validate.py 中验证validate.py 提供两个 NaFlex 参数--naflex-loader启用 NaFlex loader要求 NaFlex 兼容模型--naflex-max-seq-len固定最大序列长度默认 576。validate.py 会尝试从模型的embeds.patch_size读取 patch sizeNaFlexVit 模型暴露该属性读不到时回退为(16, 16)。README 给出的官方示例是用经典 ViTuse_naflexTrue加载在 NaFlex 数据管线下评估python validate.py /imagenet --amp -j 8 \ --model vit_base_patch16_224 \ --model-kwargs use_naflexTrue \ --naflex-loader --naflex-max-seq-len 256按 training_script.mdx 的说明validate.py 的--data-dir应指向验证图像所在文件夹而不是像训练脚本那样指向根目录上面的/imagenet按你的实际目录替换即可验证自己训练出的权重时再加上--checkpoint指向训练产出的 checkpoint 文件。成功信号是脚本在验证集上输出的 top-1 / top-5 指标training_script.mdx 对验证脚本的描述One outputs metrics on a validation set。验证时用的--naflex-max-seq-len与训练时保持一致指标才与训练内部验证口径相同。限制与参数冲突以下约束来自 train.py 源码出现时脚本会直接报错或行为受限提前检查可以省掉一轮排错--naflex-loader与--train-img-sizes是互斥的 loader 模式同时指定会触发parser.error--naflex-loader and --train-img-sizes are alternative loader modes.。--use-multi-epochs-loader不支持与--naflex-loader同时使用同样直接报错。NaFlex 模式不支持增强多路拆分源码断言num_aug_splits 1Augmentation splits not supported in NaFlex mode。模型若未暴露get_patch_size()train.py 会回退到默认(16, 16)并打印警告——此时应确认所选模型确实属于 NaFlex 兼容家族。--naflex-patch-size-probs的长度必须与--naflex-patch-sizes相同否则parser.error。Gemma4 ViT 这类消费 C-P-P patch 布局的模型需要用--naflex-patchify-channels-first否则 patch 布局与模型预期不符。收尾完成一次 NaFlex 训练与验证后的状态是checkpoint 已产出validate.py 在同一--naflex-max-seq-len下给出了验证集 top-1 / top-5 指标可以与 README 中列出的原生 checkpoint 指标如naflexvit_base_patch16_par_gap.e300_s576_in1k的 83.67 top-1对比作为参考基准。需要进一步用 checkpoint 跑推理输出时可转用inference.py的--checkpoint用法training_script.mdx 中有示例。【免费下载链接】pytorch-image-modelsThe largest collection of PyTorch image encoders / backbones. Including train, eval, inference, export scripts, and pretrained weights -- ResNet, ResNeXT, EfficientNet, NFNet, Vision Transformer (ViT), MobileNetV4, MobileNet-V3 V2, RegNet, DPN, CSPNet, Swin Transformer, MaxViT, CoAtNet, ConvNeXt, and more项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-image-models创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考