Skip to content

Naflexvit模型复现#3411

Open
yicycyc wants to merge 5 commits into
PaddlePaddle:developfrom
yicycyc:naflexvit-pr
Open

Naflexvit模型复现#3411
yicycyc wants to merge 5 commits into
PaddlePaddle:developfrom
yicycyc:naflexvit-pr

Conversation

@yicycyc

@yicycyc yicycyc commented Apr 8, 2026

Copy link
Copy Markdown

本 PR 在 PaddleClas 中补充 NaFlexViT`分类主干实现,目标是完成与timm 参考实现的前向对齐,并补齐基础训练配置、文档、导出支持和小数据收敛验证。

本次提交聚焦以下内容:

  • NaFlexViT 主干复现
  • timm 官方预训练权重前向对齐
  • ImageNet1k 基础配置补充
  • 静态图导出验证
  • 基于 TIPC 小数据集的短周期收敛实验

不包含全量 ImageNet 精度实验

主要改动

  • 新增 NaFlexViT 主干实现,支持:
    • linear patch embedding
    • learned / factorized position embedding
    • aspect-preserving position interpolation
    • register tokens
    • global average pooling head
  • 新增 3 个基础变体:
    • naflexvit_base_patch16_gap
    • naflexvit_base_patch16_par_gap
    • naflexvit_base_patch16_parfac_gap
  • 新增 ImageNet1k 配置:
    • ppcls/configs/ImageNet/NaFlexViT/naflexvit_base_patch16_gap.yaml
    • ppcls/configs/ImageNet/NaFlexViT/naflexvit_base_patch16_par_gap.yaml
    • ppcls/configs/ImageNet/NaFlexViT/naflexvit_base_patch16_parfac_gap.yaml
  • 新增 lite 收敛验证配置:
    • ppcls/configs/ImageNet/NaFlexViT/naflexvit_base_patch16_gap_lite_imagenet.yaml
  • 新增 TIPC 配置:
    • test_tipc/configs/NaFlexViT/naflexvit_base_patch16_gap_train_infer_python.txt
  • 新增前向对齐脚本:
    • tools/verify_naflexvit_alignment.py
  • 新增中文模型文档:
    • docs/zh_CN/models/ImageNet1k/NaFlexViT.md
  • 更新模型总览入口:
    • docs/zh_CN/models/ImageNet1k/README.md

对齐与兼容性说明

完成了与本地 timm 官方预训练权重的同权重前向对齐,forward_features 和最终 out 的绝对误差均小于 1e-4

此外,NaFlexViT 支持变分辨率输入;本次对齐分别覆盖了:

  • 方形输入场景:256 x 256
  • 非方形输入场景:224 x 320

实验结果

1. 官方预训练权重前向对齐

实验环境:A100 40G

Models 输入尺寸 对齐节点 max abs diff mean abs diff
naflexvit_base_patch16_gap 256 x 256 forward_features 6.48e-05 1.40e-06
naflexvit_base_patch16_gap 256 x 256 out 4.29e-06 5.60e-07
naflexvit_base_patch16_par_gap 224 x 320 forward_features 7.82e-05 1.61e-06
naflexvit_base_patch16_par_gap 224 x 320 out 6.91e-06 7.98e-07
naflexvit_base_patch16_parfac_gap 224 x 320 forward_features 8.77e-05 1.33e-06
naflexvit_base_patch16_parfac_gap 224 x 320 out 8.58e-06 6.37e-07

2. 随机初始化权重验证

随机初始化场景也完成了前向对齐验证,3 个基础变体的 forward_features max abs diff 均在 1e-6 量级。
该部分主要用于验证结构实现、参数映射和权重转换逻辑正确性。

3. 小数据收敛实验

使用 TIPC lite_train_lite_infer 小数据集,在 GPU 上对 naflexvit_base_patch16_gap 进行了 5 epoch 短周期训练,用于证明训练链路能够正常收敛。

配置 数据 设备 Epoch Train CELoss Train Top1 Train Top5
naflexvit_base_patch16_gap_lite_imagenet.yaml TIPC lite_train_lite_infer gpu:0 1 7.20865 0.00000 0.00000
naflexvit_base_patch16_gap_lite_imagenet.yaml TIPC lite_train_lite_infer gpu:0 5 3.46303 0.20690 0.58621

从训练集指标看,loss 明显下降,Top-1 / Top-5 持续上升,可以作为“训练链路可正常收敛”的快速验证。

4. 导出验证

以下 3 个基础变体均已完成静态图导出验证,可成功生成 inference.pdmodelinference.pdiparams

  • naflexvit_base_patch16_gap
  • naflexvit_base_patch16_par_gap
  • naflexvit_base_patch16_parfac_gap

验证命令

前向对齐

python tools/verify_naflexvit_alignment.py --variant naflexvit_base_patch16_gap --height 256 --width 256 --batch-size 2 --pretrained --torch-device cuda --paddle-device gpu
python tools/verify_naflexvit_alignment.py --variant naflexvit_base_patch16_par_gap --height 224 --width 320 --batch-size 2 --pretrained --torch-device cuda --paddle-device gpu
python tools/verify_naflexvit_alignment.py --variant naflexvit_base_patch16_parfac_gap --height 224 --width 320 --batch-size 2 --pretrained --torch-device cuda --paddle-device gpu

@paddle-bot

paddle-bot Bot commented Apr 8, 2026

Copy link
Copy Markdown

Thanks for your contribution!

@yicycyc yicycyc changed the title Naflexvit pr Naflexvit模型复现 Apr 8, 2026
Comment on lines +268 to +274
use_antialias = paddle.get_device().startswith("gpu")
pos = F.interpolate(
self.pos_embed.transpose([0, 3, 1, 2]).astype("float64"),
size=interp_size,
mode=self.pos_embed_interp_mode,
align_corners=False,
antialias=use_antialias,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

F.interpolate(..., antialias=use_antialias) 是 PaConvert 从 PyTorch 转换的残留——paddle.nn.functional.interpolate 不支持 antialias 参数,eval/export 阶段会报 unexpected keyword argument 'antialias'。

删掉use_antialias = paddle.get_device().startswith("gpu")这一行就可以跑通

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants