VanillaNet:深度学习中极简主义的力量
VanillaNet的官方PyTorch实现,来自以下论文: VanillaNet:深度学习中极简主义的力量 Hanting Chen、王云鹤、郭建远和陶大程
VanillaNet是一种创新的神经网络架构,专注于简洁性和高效性。它摒弃了复杂的特征,如快捷连接和注意力机制,使用较少的层数,同时仍保持出色的性能。该项目展示了使用精简架构也能取得有效结果,从而为计算机视觉领域开辟了新路径,挑战了基础模型的现状。
新闻
2023年6月2日 除了论文中报告的速度外,我们还在A100上使用NVIDIA TensorRT测量了速度,以及在华为昇腾910上的速度。VanillaNet的推理速度优于其他对手。🍺
深度和速度比较
VanillaNet在性能上可与流行的计算机视觉基础模型相媲美,但具有更浅的深度和更快的推理速度:
- 11层的VanillaNet以3.59毫秒的速度达到约**81%的Top-1准确率,比ResNet-50(7.64毫秒)的速度提高了100%**以上。
- 13层的VanillaNet(1.5倍*)以9.72毫秒的速度达到约**83%的Top-1准确率,比Swin-S(20.25毫秒)的速度提高了100%**以上。
- 在A100上使用tensorRT FP32,11层的VanillaNet以0.69毫秒的速度达到约**81%的Top-1准确率,比Swin-T(1.41毫秒)和ResNet-101(1.58毫秒)的速度提高了100%**以上。
| 名称 | 参数量(M) | FLOPs(B) | 准确率(%) | 延迟(ms)
Pytorch
A100 | 延迟(ms)
MindSpore
Ascend 910 | 延迟(ms)
TRT FP32
A100 | 延迟(ms)
TRT FP16
A100 | 延迟(ms)
TRT FP32
V100 | |:---:|:---:|:---:|:---:| :---:|:---:|:---:|:---:|:---:| | Swin-T | 28.3 | 4.5 | 81.18 | 10.51 | 2.24 | 1.41 | 0.98 |4.71 | | ConvNextV2-N | 15.6 | 2.45 | 81.2 | 6.85 | 3.43 | - | - | 2.81 | | ResNet-18 | 11.7 | 1.8 | 70.6 | 3.12 | 0.60 | 0.41 | 0.28 | 1.63 | | ResNet-34 |21.8|3.7|75.5|5.57|0.97|0.77|0.49| 2.18 | | ResNet-50 |25.6|4.1|79.8|7.64|1.23|0.80|0.54| 3.03 | | ResNet-101 |45.0|8.0|81.3|15.35|2.34|1.58|1.04| 4.46 | | ResNet-152 |60.2|11.5|81.8|22.19|3.40|2.30|1.49| 6.89 | | VanillaNet-5 | 15.5 | 5.2 | 72.49 | 1.61 |0.39|0.33|0.27| 1.60 | | VanillaNet-6 | 32.5 | 6.0 | 76.36 | 2.01 |0.53|0.40|0.33|1.84| | VanillaNet-7 | 32.8 | 6.9 | 77.98 | 2.27 |0.76|0.47|0.39|2.02| | VanillaNet-8 | 37.1 | 7.7 | 79.13 | 2.56 |0.80|0.52|0.45|2.26| | VanillaNet-9 | 41.4 | 8.6 | 79.87 | 2.91 |0.86|0.58|0.49|2.55| | VanillaNet-10 | 45.7 | 9.4 | 80.57 | 3.24 |0.89|0.63|0.53|2.84| | VanillaNet-11 | 50.0 | 10.3 | 81.08 | 3.59 | 0.95 |0.69|0.58|3.14| | VanillaNet-12 | 54.3 | 11.1 | 81.55 | 3.82 |1.00|0.75|0.62|3.44| | VanillaNet-13 | 58.6 | 11.9 | 82.05 | 4.26 |1.05|0.82|0.67|3.69|
下游任务
请参考此页面。
VanillaNet在检测和分割任务中实现了更高的每秒帧数(FPS)。
目录
- ImageNet-1K测试代码
- VanillaNet-5到VanillaNet-10的ImageNet-1K训练代码
- VanillaNet-5到VanillaNet-10的ImageNet-1K预训练权重
- VanillaNet-11到VanillaNet-13的ImageNet-1K训练代码
- VanillaNet-11到VanillaNet-13的ImageNet-1K预训练权重
- 下游迁移(检测、分割)代码
结果和预训练模型
ImageNet-1K训练模型
名称 | 参数量(M) | FLOPs(B) | 延迟(ms) | 准确率(%) | 模型 |
---|---|---|---|---|---|
VanillaNet-5 | 15.5 | 5.2 | 1.61 | 72.49 | 模型 |
VanillaNet-6 | 32.5 | 6.0 | 2.01 | 76.36 | 模型 |
VanillaNet-7 | 32.8 | 6.9 | 2.27 | 77.98 | 模型 |
VanillaNet-8 | 37.1 | 7.7 | 2.56 | 79.13 | 模型 |
VanillaNet-9 | 41.4 | 8.6 | 2.91 | 79.87 | 模型 |
VanillaNet-10 | 45.7 | 9.4 | 3.24 | 80.57 | 模型 |
VanillaNet-11 | 50.0 | 10.3 | 3.59 | 81.08 | 模型 |
VanillaNet-12 | 54.3 | 11.1 | 3.82 | 81.55 | 模型 |
VanillaNet-13 | 58.6 | 11.9 | 4.26 | 82.05 | 模型 |
VanillaNet-13-1.5x | 127.8 | 26.5 | 7.83 | 82.53 | 模型 |
VanillaNet-13-1.5x† | 127.8 | 48.9 | 9.72 | 83.11 | 模型 |
安装
实验结果使用 torch==1.10.2+cu113 torchvision==0.11.3+cu113 timm==0.6.12
生成。其他版本可能也适用。
按照官方说明安装 Pytorch 和 torchvision。
安装所需的包:
pip install timm==0.6.12
pip install cupy-cuda113
pip install torchprofile
pip install einops
pip install tensorboardX
pip install terminaltables
数据集准备
下载 ImageNet-1K 分类数据集并按如下结构组织数据:
/path/to/imagenet-1k/
train/
class1/
img1.jpeg
class2/
img2.jpeg
val/
class1/
img3.jpeg
class2/
img4.jpeg
测试
我们给出一个 VanillaNet-5 的示例评估命令:
不使用部署模式:
python -m torch.distributed.launch --nproc_per_node=1 main.py --model vanillanet_5 --data_path /path/to/imagenet-1k/ --real_labels /path/to/imagenet_real_labels.json --finetune /path/to/vanillanet_5.pth --eval True --model_key model_ema --crop_pct 0.875
使用部署模式:
python -m torch.distributed.launch --nproc_per_node=1 main.py --model vanillanet_5 --data_path /path/to/imagenet-1k/ --real_labels /path/to/imagenet_real_labels.json --finetune /path/to/vanillanet_5.pth --eval True --model_key model_ema --crop_pct 0.875 --switch_to_deploy /path/to/vanillanet_5_deploy.pth
训练
你可以使用以下命令在一台配有 8 个 GPU 的机器上训练 VanillaNet-5:
python -m torch.distributed.launch --nproc_per_node=8 main.py \
--model vanillanet_5 \
--data_path /path/to/imagenet-1k \
--batch_size 128 --update_freq 1 --epochs 300 --decay_epochs 100 \
--lr 3.5e-3 --weight_decay 0.35 --drop 0.05 \
--opt lamb --aa rand-m7-mstd0.5-inc1 --mixup 0.1 --bce_loss \
--output_dir /path/to/save_results \
--model_ema true --model_ema_eval true --model_ema_decay 0.99996 \
--use_amp true
- 这里,有效批量大小 =
--nproc_per_node
*--batch_size
*--update_freq
。在上面的例子中,有效批量大小是8*128*1 = 1024
。
要训练其他 VanillaNet 变体,需要更改 --model
。以下是一些示例。
VanillaNet-6
``` python -m torch.distributed.launch --nproc_per_node=8 main.py \ --model vanillanet_6 \ --data_path /path/to/imagenet-1k \ --batch_size 128 --update_freq 1 --epochs 300 --decay_epochs 100 \ --lr 4.8e-3 --weight_decay 0.32 --drop 0.05 \ --layer_decay 0.8 --layer_decay_num_layers 4 \ --opt lamb --aa rand-m7-mstd0.5-inc1 --mixup 0.15 --bce_loss \ --output_dir /path/to/save_results \ --model_ema true --model_ema_eval true --model_ema_decay 0.99996 \ --use_amp true ```VanillaNet-7
python -m torch.distributed.launch --nproc_per_node=8 main.py \
--model vanillanet_7 \
--data_path /path/to/imagenet-1k \
--batch_size 128 --update_freq 1 --epochs 300 --decay_epochs 100 \
--lr 4.7e-3 --weight_decay 0.35 --drop 0.05 \
--layer_decay 0.8 --layer_decay_num_layers 5 \
--opt lamb --aa rand-m7-mstd0.5-inc1 --mixup 0.4 --bce_loss \
--output_dir /path/to/save_results \
--model_ema true --model_ema_eval true --model_ema_decay 0.99996 \
--use_amp true
VanillaNet-8
python -m torch.distributed.launch --nproc_per_node=8 main.py \
--model vanillanet_8 \
--data_path /path/to/imagenet-1k \
--batch_size 128 --update_freq 1 --epochs 300 --decay_epochs 100 \
--lr 3.5e-3 --weight_decay 0.3 --drop 0.05 \
--opt lamb --aa rand-m7-mstd0.5-inc1 --mixup 0.4 --bce_loss \
--output_dir /path/to/save_results \
--model_ema true --model_ema_eval true --model_ema_decay 0.99996 \
--use_amp true
VanillaNet-9
python -m torch.distributed.launch --nproc_per_node=8 main.py \
--model vanillanet_9 \
--data_path /path/to/imagenet-1k \
--batch_size 128 --update_freq 1 --epochs 300 --decay_epochs 100 \
--lr 3.5e-3 --weight_decay 0.3 --drop 0.05 \
--opt lamb --aa rand-m7-mstd0.5-inc1 --mixup 0.4 --bce_loss \
--output_dir /path/to/save_results \
--model_ema true --model_ema_eval true --model_ema_decay 0.99996 \
--use_amp true
VanillaNet-10
python -m torch.distributed.launch --nproc_per_node=8 main.py \
--model vanillanet_10 \
--data_path /path/to/imagenet-1k \
--batch_size 128 --update_freq 1 --epochs 300 --decay_epochs 100 \
--lr 3.5e-3 --weight_decay 0.25 --drop 0.05 \
--opt lamb --aa rand-m7-mstd0.5-inc1 --mixup 0.4 --bce_loss \
--output_dir /path/to/save_results \
--model_ema true --model_ema_eval true --model_ema_decay 0.99996 \
--use_amp true
致谢
本仓库基于timm、DeiT、BEiT、RegVGG和ConvNeXt等仓库构建。
许可证
本项目在MIT许可证下发布。更多信息请参阅LICENSE文件。
说明文档PDF
说明文档PDF(中文版)可以在这里找到
引用
如果我们的工作对您的研究有帮助,请考虑引用:
@article{chen2023vanillanet,
title={VanillaNet: the Power of Minimalism in Deep Learning},
author={Chen, Hanting and Wang, Yunhe and Guo, Jianyuan and Tao, Dacheng},
journal={arXiv preprint arXiv:2305.12972},
year={2023}
}
注意
此开源项目不是华为的官方产品,华为不预期为此项目提供支持。