FRN——小样本学习SOTA模型
CVPR2021经典文献:Few-Shot Classification with Feature Map Reconstruction Networks
★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>
一、论文概述
论文Few-Shot Classification with Feature Map Reconstruction Networks是顶会CVPR2021上发表的一种小样本学习经典方法。该方法在小样本学习的benchmark上依然具有最佳的性能指标,是该领域的重要方法。
FRN将小样本分类问题归结为潜在空间中的特征重构问题。作者认为,通过支持样本重构查询样本特征的能力,决定了查询样本的所属类别。作者在小样本学习中引入了一种新的机制,以闭合解的形式从支持样本特征直接向查询样本特征做回归,无需引入新的模块或者大规模的训练参数。上述方法得到的模型(FRN),相比先前的其他方法,无论在计算效率上还是性能表现上都更有优势。FRN在四个细粒度数据集上展现出实质性提升。在通用的粗粒度数据集mini-ImageNet和tiered-ImageNet上,也达到了SOTA指标。
下图展示了FRN的基本工作流程。
二、复现精度
基于paddlepaddle深度学习框架,对文献算法进行复现后,本项目在mini-ImageNet上达到的测试精度,如下表所示。
task | 本项目精度 | 参考文献精度 |
---|---|---|
5-Way 1-Shot | 66.45±0.19 | |
5-Way 5-Shot | 82.83±0.13 |
模型训练包括了两个过程,首先是模型预训练,按照典型分类网络的训练过程,将整个训练集送入backbone进行训练;然后是微调过程,按照episode training的训练范式,配置为20-Way 5-Shot方式进行微调训练。这两个训练过程的训练超参数设置如下:
(1)预训练过程
超参数名 | 设置值 |
---|---|
lr | 0.1 |
gamma | 0.1 |
epoch | 350 |
milestones | 200 300 |
batch_size | 512 |
(2)微调训练过程
超参数名 | 设置值 |
---|---|
lr | 1e-3 |
gamma | 0.1 |
epoch | 150 |
train_n_episode | 1000 |
milestones | 70 120 |
train_n_way | 20 |
n_shot | 5 |
三、数据集
miniImageNet数据集节选自ImageNet数据集。
DeepMind团队首次将miniImageNet数据集用于小样本学习研究,从此miniImageNet成为了元学习和小样本领域的基准数据集。
关于该数据集的介绍可以参考https://blog.csdn.net/wangkaidehao/article/details/105531837
miniImageNet是由Oriol Vinyals等在Matching Networks
中首次提出的,该文献是小样本分类任务的开山制作,也是本次复现论文关于该数据集的参考文献。在Matching Networks中,
作者提出对ImageNet中的类别和样本进行抽取(参见其Appendix B),形成了一个数据子集,将其命名为miniImageNet。
划分方法,作者仅给出了一个文本文件进行说明。
Vinyals在文中指明了miniImageNet图片尺寸为84x84。因此,后续小样本领域的研究者,均是基于原始图像,在代码中进行预处理,
将图像缩放到84x84的规格。
至于如何缩放到84x84,本领域研究者各有各的方法,通常与研究者的个人理解相关,但一般对实验结果影响不大。本次文献论文原文,未能给出
miniImageNet的具体实现方法,本项目即参考领域内较为通用的预处理方法进行处理。
- 数据集大小:
- miniImageNet包含100类共60000张彩色图片,其中每类有600个样本。
mini-imagenet一共有2.86GB
- miniImageNet包含100类共60000张彩色图片,其中每类有600个样本。
- 数据格式:
|- miniImagenet
| |- images/
| | |- n0153282900000005.jpg
| | |- n0153282900000006.jpg
| | |- …
| |- train.csv
| |- test.csv
| |- val.csv
数据集链接:miniImagenet
四、环境依赖
-
硬件:
- x86 cpu
- NVIDIA GPU
-
框架:
- PaddlePaddle = 2.4
-
其他依赖项:
- numpy==1.19.3
- tqdm==4.59.0
- Pillow==8.3.1
五、快速开始
1、解压数据集和源代码:
!unzip -n -d ./data/ ./data/data105646/mini-imagenet-sxc.zip
%cd /home/aistudio/
!unzip -n -d ./data/ ./data/data105646/mini-imagenet-sxc.zip
%cd /home/aistudio/work/
!unzip -o frn.zip
# 生成json文件
!cp write_miniImagenet_filelist.py /home/aistudio/data/mini-imagenet-sxc/
%cd /home/aistudio/data/mini-imagenet-sxc/
!python write_miniImagenet_filelist.py
2、执行以下命令启动预训练:
python pretrain.py --dataset mini_imagenet --data_path /home/aistudio/data/mini-imagenet-sxc --method stl_frn --lr 1e-1 --gamma 1e-1 --epoch 350 --milestones 200 300 --batch_size 512 --val_n_episode 600 --image_size 84 --model ResNet12 --n_shot 1 --n_query 15 --gpu
模型开始训练,运行完毕后,训练log和模型参数保存在./checkpoints/mini_imagenet/ResNet12_stl_frn_pretrain/目录下,分别是:
best_model.pdparams # 最优模型参数文件
output.log # 训练LOG信息
训练完成后,可将上述文件手动保存到其他目录下,避免被后续训练操作覆盖。
%cd /home/aistudio/work
!python pretrain.py --dataset mini_imagenet --data_path /home/aistudio/data/mini-imagenet-sxc --method stl_frn --lr 1e-1 --gamma 1e-1 --epoch 350 --milestones 200 300 --batch_size 512 --val_n_episode 600 --image_size 84 --model ResNet12 --n_shot 1 --n_query 15 --gpu
3、执行以下命令启动微调训练:
python meta_train.py --dataset mini_imagenet --data_path /home/aistudio/data/mini-imagenet-sxc --method meta_frn --lr 1e-3 --gamma 1e-1 --epoch 150 --train_n_episode 1000 --val_n_episode 600 --milestones 70 120 --image_size 84 --model ResNet12 --train_n_way 20 --val_n_way 5 --n_shot 5 --n_query 15 --gpu --pretrain_path ./checkpoints/mini_imagenet/ResNet12_stl_frn_pretrain/best_model.pdparams
模型开始训练,运行完毕后,训练log和模型参数保存在./checkpoints/mini_imagenet/ResNet12_meta_frn_20way_5shot_metatrain/目录下,分别是:
best_model.pdparams # 最优模型参数文件
output.log # 训练LOG信息
训练完成后,可将上述文件手动保存到其他目录下,避免被后续训练操作覆盖。
%cd /home/aistudio/work
!python meta_train.py --dataset mini_imagenet --data_path /home/aistudio/data/mini-imagenet-sxc --method meta_frn --lr 1e-3 --gamma 1e-1 --epoch 150 --train_n_episode 1000 --val_n_episode 600 --milestones 70 120 --image_size 84 --model ResNet12 --train_n_way 20 --val_n_way 5 --n_shot 5 --n_query 15 --gpu --pretrain_path ./checkpoints/mini_imagenet/ResNet12_stl_frn_pretrain/best_model.pdparams
4、执行以下命令进行评估
python test.py --dataset mini_imagenet --data_path /home/aistudio/data/mini-imagenet-sxc --model ResNet12 --method meta_frn --image_size 84 --gpu --n_shot 1 --model_path ./checkpoints/mini_imagenet/ResNet12_meta_frn_20way_5shot_metatrain/best_model.pdparams --test_task_nums 1 --test_n_episode 600
用于评估模型在小样本任务下的精度。
# 5-Way 1-Shot评估
%cd /home/aistudio/work
!python test.py --dataset mini_imagenet --data_path /home/aistudio/data/mini-imagenet-sxc --model ResNet12 --method meta_frn --image_size 84 --gpu --n_shot 1 --model_path ./checkpoints/mini_imagenet/ResNet12_meta_frn_20way_5shot_metatrain/best_model.pdparams --test_task_nums 1 --test_n_episode 600
# 5-Way 5-Shot评估
%cd /home/aistudio/work
!python test.py --dataset mini_imagenet --data_path /home/aistudio/data/mini-imagenet-sxc --model ResNet12 --method meta_frn --image_size 84 --gpu --n_shot 5 --model_path ./checkpoints/mini_imagenet/ResNet12_meta_frn_20way_5shot_metatrain/best_model.pdparams --test_task_nums 1 --test_n_episode 600
六、代码结构与详细说明
6.1 代码结构
├── data # 数据处理相关
│ ├── datamgr.py # data manager模块
│ ├── dataset.py # data set模块
├── methods # 模型相关
│ ├── FRN.py # FRN核心算法
├── network # backbone
│ ├── conv.py # Conv-4和Conv-6代码实现
│ ├── resnet.py # ResNet-12代码实现
├── scripts # 运行工程脚本
│ ├── mini_imagenet
│ │ ├── run_frn
│ │ │ ├── run_frn_metatrain.sh # 运行微调训练
│ │ │ ├── run_frn_pretrain.sh # 运行预训练
│ │ │ ├── run_frn_test.sh # 运行测试
├── meta_train.py # 微调训练代码
├── pretrain.py # 预训练代码
├── test.py # 测试代码
├── utils.py # 公共调用函数
├── wirite_miniImagenet_filelist.py # 生成mini-ImageNet数据json文件
6.2 参数说明
可以在 pretrain.py
中设置训练与评估相关参数,具体如下:
参数 | 默认值 | 说明 |
---|---|---|
----batch_size | 128 | batch size |
–lr | 0.05 | 初始学习率 |
–wd | 5e-4 | weight decay超参 |
–gamma | 0.1 | lr_scheduler衰减系数 |
–milestones | 80, 120 | 达到相应epoch后,lr_scheduler开始衰减 |
–epoch | 150 | 遍历数据集的迭代轮数 |
–gpu | True | 是否使用GPU进行训练 |
–dataset | mini_imagenet | 指定训练数据集 |
–data_path | ‘’ | 指定数据集的路径 |
–model | ResNet-12 | 指定采用的backbone |
–val | meta | 指定验证方式 |
–train_n_way | 20 | 小样本训练类别数 |
–val_n_episode | 600 | 验证时测试多少个episode |
–val_n_way | 5 | 小样本验证类别数 |
–n_shot | 1 | 给定支持样本的个数 |
–n_query | 15 | 指定查询样本的个数 |
–num_classes | 64 | 指定base set类别总数 |
–save_freq | 50 | 指定每隔多少个epoch保存一次模型参数 |
–seed | 0 | 指定随机数种子 |
–resume | ‘’ | 指定恢复训练时加载的中间参数文件路径 |
6.3 训练流程
可参考快速开始章节中的描述
训练输出
执行训练开始后,将得到类似如下的输出。每一轮epoch
训练将会打印当前training loss、training acc、val loss、val acc以及训练kl散度。
Epoch 0 | Batch 0/150 | Loss 4.158544
best model! save...
val loss is 0.00, val acc is 37.46
model best acc is 37.46, best acc epoch is 0
This epoch use 7.61 minutes
train loss is 3.72, train acc is 10.84
Epoch 1 | Batch 0/150 | Loss 3.052964
val loss is 0.00, val acc is 37.46
model best acc is 37.46, best acc epoch is 0
This epoch use 3.73 minutes
train loss is 2.96, train acc is 25.28
Epoch 2 | Batch 0/150 | Loss 2.588413
val loss is 0.00, val acc is 37.46
model best acc is 37.46, best acc epoch is 0
This epoch use 3.71 minutes
train loss is 2.59, train acc is 33.27
...
6.4 测试流程
可参考快速开始章节中的描述
此时的输出为:
八、模型信息
训练完成后,模型和相关LOG保存在./results/5w1s和./results/5w5s目录下。
训练和测试日志保存在results目录下。
信息 | 说明 |
---|---|
发布者 | hrdwsong |
时间 | 2023.03 |
框架版本 | Paddle 2.4 |
应用场景 | 小样本学习 |
支持硬件 | GPU、CPU |
Aistudio地址 | https://aistudio.baidu.com/aistudio/projectdetail/5723600?contributionType=1&sUid=527829&shared=1&ts=1678943299939 |
请点击此处查看本环境基本用法.
Please click here for more detailed instructions.
此文章为转载
原文链接
更多推荐
所有评论(0)