元学习到底是什么?few-shot-meta-baseline 用两阶段训练给出最简答案
【免费下载链接】few-shot-meta-baselineMeta-Baseline: Exploring Simple Meta-Learning for Few-Shot Learning, in ICCV 2021项目地址: https://gitcode.com/gh_mirrors/fe/few-shot-meta-baseline
元学习(Meta-Learning)是让小模型"学会学习"的研究方向,而 few-shot-meta-baseline 正是解开这个概念的最简答案。这个开源项目实现了 ICCV 2021 论文《Meta-Baseline: Exploring Simple Meta-Learning for Few-Shot Learning》,用一套两阶段训练流程,让新手也能快速理解小样本学习(Few-Shot Learning)的核心思想,并在 miniImageNet 上取得 5-way 1-shot 63.17% 的出色准确率。
一、先搞懂:什么是元学习与小样本学习?🤔
小样本学习的任务很直观:只给每个类别几张图片,模型就要学会识别新类别。
- 5-way 1-shot:从 5 个新类别中各取 1 张图片做参考,再判断查询图片属于哪一类
- 5-way 5-shot:每个类别提供 5 张参考图片
传统深度学习需要海量标注数据,而小样本学习希望模型"举一反三"。元学习就是训练这种"快速适应新任务"能力的统称——它不直接学分类,而是学习如何学习。
few-shot-meta-baseline 的过人之处在于:它把复杂的元学习算法简化成分类器预训练 + 元学习微调两步,思路清晰到令人惊讶。
二、Meta-Baseline 的核心思想:两阶段训练 🔑
Meta-Baseline 认为,此前许多元学习算法过于复杂,性能却未必更好。它提出一个简单假设:
一个分类器预训练得到的特征提取器,加上基于原型(Prototype)的元学习微调,就足够强大了。
整个过程分为两阶段:
| 阶段 | 名称 | 做什么 | 入口脚本 |
|---|---|---|---|
| 第一阶段 | 分类器预训练(Classifier-Baseline) | 在大规模基类上训练普通分类器,学到通用特征 | train_classifier.py |
| 第二阶段 | 元学习训练(Meta-Baseline) | 用 episode 方式模拟小样本任务,微调特征提取器 | train_meta.py |
阶段一:先用基类训练一个普通分类器
在 miniImageNet 上,训练集有 64 个基类。第一阶段就是普通的图像分类训练:把图片输入 ResNet-12 编码器,接一个线性分类头,用交叉熵损失优化。配置见configs/train_classifier_mini.yaml:
model: classifier model_args: encoder: resnet12 classifier: linear-classifier classifier_args: {n_classes: 64}这个阶段学到的是通用的视觉特征——猫和狗的区别、纹理和形状的语义,都沉淀在编码器里。
阶段二:用 episode 方式做元学习训练
第二阶段的训练方式完全不同。每个训练批次(episode)会随机抽取 5 个类别、每类若干张图片,模拟真实的 few-shot 测试场景,配置见configs/train_meta_mini.yaml:
model: meta-baseline model_args: encoder: resnet12 load_encoder: ./save/classifier_mini-imagenet_resnet12/epoch-last.pth n_way: 5 n_shot: 1注意关键的load_encoder:第二阶段直接加载第一阶段训练好的编码器作为初始化,这正是"两阶段训练"的衔接点。
三、Meta-Baseline 模型内部是怎么工作的?🧠
模型实现只有不到 50 行代码,在models/meta_baseline.py中。它的前向过程非常简单:
- 将支持集(support set)和查询集(query set)一起送入编码器提取特征
- 对支持集特征按类别求平均,得到每个类别的"原型"(Prototype)
- 计算查询特征与各原型的余弦相似度,得到分类 logits
if self.method == 'cos': x_shot = x_shot.mean(dim=-2) # 求类别原型 x_shot = F.normalize(x_shot, dim=-1) # L2 归一化 x_query = F.normalize(x_query, dim=-1)核心洞察在于:预训练特征 + 类别均值原型 + 余弦距离,就是最朴素也最有效的元学习方案。它无需复杂的梯度二阶导(如 MAML),无需额外的注意力机制(如 Matching Networks),却能在多数基准上超越这些成名算法。
四、效果如何?用数据说话 📊
以下是项目 README 中公开的 5-way 准确率对比(%),足以证明"简单"不等于"弱":
miniImageNet 上的表现
| 方法 | 1-shot | 5-shot |
|---|---|---|
| Baseline++ | 51.87 | 75.68 |
| MetaOptNet | 62.64 | 78.63 |
| Meta-Baseline | 63.17 | 79.26 |
tieredImageNet 上的表现
| 方法 | 1-shot | 5-shot |
|---|---|---|
| LEO | 66.33 | 81.44 |
| MetaOptNet | 65.99 | 81.56 |
| Meta-Baseline | 68.62 | 83.29 |
在更大规模的 ImageNet-800 上,使用 ResNet-50 骨干的 Meta-Baseline 达到1-shot 89.70%、5-shot 96.14%。值得注意的是,文中采用的 ResNet-12 骨干(通道数 64-128-256-512,见models/resnet12.py)没有使用任何额外技巧(如 DropBlock 或加宽通道),这让成绩更具说服力。
五、新手如何快速上手运行?🚀
项目结构清晰,运行门槛低。克隆仓库后按以下步骤操作:
1. 准备环境
- Python 3.7.3
- PyTorch 1.2.0
- tensorboardX
数据集(miniImageNet / tieredImageNet / ImageNet-800)下载后,链接到materials/目录下,分别命名为mini-imagenet、tiered-imagenet和imagenet。
2. 阶段一:训练分类器基线
python train_classifier.py --config configs/train_classifier_mini.yaml训练完成后,模型保存在save/目录,其中的编码器就是第二阶段的初始化。
3. 阶段二:训练 Meta-Baseline
python train_meta.py --config configs/train_meta_mini.yaml4. 测试 few-shot 性能
修改configs/test_few_shot.yaml中的load指向第二阶段保存的模型,然后运行:
python test_few_shot.py --shot 1想要测试 5-shot 就把--shot 5;想额外评估单类 AUC 指标,加上--sauc参数即可。
六、值得学习的代码结构清单 📁
对初学者来说,这个项目是极佳的教学材料,几个文件尤其值得精读:
models/meta_baseline.py:Meta-Baseline 核心模型,理解"原型+余弦相似度"的完整实现models/classifier.py:分类器基线与线性分类头,对应第一阶段models/resnet12.py:小样本学习常用骨干 ResNet-12,含初始化细节train_meta.py/train_classifier.py:两阶段训练的完整训练循环datasets/samplers.py:episode 采样器,理解"按类别随机抽任务"如何实现configs/目录:mini / tiered / im800 三套数据集的完整配置模板
七、总结:元学习没有想象中神秘 ✨
few-shot-meta-baseline 用最简洁的两阶段训练告诉我们:元学习完全可以被拆解为"先学通用特征,再学快速适应"。它不仅是 ICCV 2021 的高引论文实现,更是一份优秀的学习范本——无论你是想入门小样本学习,还是希望在自己的项目中快速部署 few-shot 能力,这个仓库都值得你深入研读。
从今天起,从models/meta_baseline.py的 50 行代码开始,你也能亲手揭开元学习的神秘面纱!🚀
【免费下载链接】few-shot-meta-baselineMeta-Baseline: Exploring Simple Meta-Learning for Few-Shot Learning, in ICCV 2021项目地址: https://gitcode.com/gh_mirrors/fe/few-shot-meta-baseline
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考