简单描述一下方法的流程,虽然我觉得论文摘要说得还挺清楚的:
首先利用base类和novel类的样本初始化所有类的均值。以5-way 1-shot问题为例,meta-train的阶段,每一个episode,我们都可以计算这5个类的episode类中心,然后将所有类的全局类中心和5个episode类中心都输入到注册模块,得到这5个类的注册后的类中心。然后,将query set的样本和注册后的5个类中心计算相似度,得到loss更新网络。经过不断地训练来更新所有类的全局类中心。在meta-test阶段,输入support set的样本,得到5个注册后的全局类中心,用这个类中心对query set中的样本进行分类,得到最终的精度。
问题清单
思考从问题出发。昨天老师说,有一个思路是先接受,再去找漏洞。
-
D \mathcal D Dmeta-train和 D \mathcal D Dmeta-test是如何构建的?
参考4.2.1第一段的倒数第二句,few learning在构建时分两步:
1) 类别拆分:比如miniImageNet默认是训练/验证/测试:64/16/20。
D \mathcal D Dmeta-train由64+20类组成,64×600+20×nfew个样本;
D \mathcal D Dmeta-test由20类组成,20×600。[见3.3第一段]
此时,初始化每个类的类别表示。
2) 任务采样:
meta-training阶段:
1) 采样类别,从84个类中采样5个类
2) 采样样本,novel类数据合成,由nfew个样本得到ns+nq个样本;
采样n个任务训练meta-learner;
meta-testing阶段,从 D \mathcal D Dmeta-test采样600次任务计算模型性能。 -
全局类表示的初始化是在数据增强之前还是之后?
之前,见[见3.3第一段]。 -
全局类表示在训练时,是如何更新的?
数据构建好之后,用特征均值初始化每个类的全局类表示。 -
在meat-training阶段,模型见过多少novel类的样本?
每个novel类只见过 n f e w n_few nfew个样本。 -
在meta-test阶段,episode的support set如何采样?
support set用训练集中的ntest个类别的nfew个样本。
[见3.3 第2段] We use the labeled images of the ntest novel classes in the training set as the support set (i.e., the few shots).
问题:类别采样充分,样本采样不充分,不能测试出meta-learner的泛化性! -
这个方法的局限性:不能处理增量模式。训练阶段模型需要知道novel类的样本。
-
Algorithm 1下面第二段Finally开头,用选定的全局类中心可以识别novel类样本。但是,这个过程不可微?怎么理解?
GCR
motivation
在fsl中,基于元学习的方法存在一个缺陷:这些模型是在源数据(
D
m
e
t
a
−
t
r
a
i
n
D_{meta-train}
Dmeta−train)上学到的。不能够保证模型能够很好地泛化到目标数据(
D
m
e
t
a
−
t
r
a
i
n
D_{meta-train}
Dmeta−train)上。因此,论文将novel类的support样本也引入到训练过程当中。由于novel类的support set中样本很少,所以论文提出一种样本合成方案来弥补新类样本不足的问题。
论文有两个重要模块:
- 注册模块:学习全局类别标识(用base类和novel类的训练样本)
- 合成模块:novel类样本合成
以下是论文所要达到的效果:
method
Registration Module 注册模块
计算样本特征和类别全局表示的相似性分数:
注册模块的loss
Sample Synthesis Module 样本合成模块
真实图片通过裁剪、翻转和幻想技术,一共得到
k
t
k_t
kt张图片。采样
k
r
k_r
kr张(
k
r
k_r
kr采样自[0,
k
t
k_t
kt]分布并向上取整),从对应的特征表示集合
f
1
,
.
.
,
f
k
r
{f_1, .., f_{k_r}}
f1,..,fkr的子空间合成一个新的样本
r
c
j
r_{c_j}
rcj(
c
j
c_j
cj类)。具体做法如下:
从[0,1]均匀分布中采样
k
r
k_r
kr个数
{
ν
1
,
…
,
ν
k
r
}
\{ \nu_1, \dots, \nu_{k_r} \}
{ν1,…,νkr},然后对
k
r
k_r
kr个特征加权平均得到新的样本
r
c
j
r_{c_j}
rcj。
Few Shot Learning By Registration通过注册实现小样本学习
流程如下:
-
初始化类别表示:取每类的所有样本视觉特征的平均值作为初始化类别表示;(模型的目的就是基于该初始化学习novel类的全局类别表示);
-
each training iteration,一个episode/mini-batch通过以下三个步骤获得:
1)从所有类别 C t o t a l = C b a s e + C n o v e l C_{total}=C_{base}+C_{novel} Ctotal=Cbase+Cnovel中采样 n t r a i n n_{train} ntrain个类作为 C t r a i n C_{train} Ctrain;
2)从training set里为 C t r a i n C_{train} Ctrain中的每个类随机选取 n s n_s ns个样本组成support set S = { ( x i , y i ) , i = 1 , … , n s × n t r a i n } S=\{(x_i, y_i), i=1,\dots,n_s \times n_{train} \} S={(xi,yi),i=1,…,ns×ntrain};
3) 从training set里为 C t r a i n C_{train} Ctrain中的每个类选取 n q n_q nq个样本组成query set Q = { ( x k , y k ) , k = 1 , … , n q × n t r a i n } Q = \{ (x_k, y_k), k=1,\dots,n_q \times n_{train} \} Q={(xk,yk),k=1,…,nq×ntrain}
注意: 每个novel类只有 n f e w n_{few} nfew个标注样本,所以先增广到 n s + n q n_s+n_q ns+nq个样本。 -
each testing iteration, 一个episode和training episode在三个方面不同:
1)从novel类别集合 C n o v e l C_{novel} Cnovel中采样 n t e s t n_{test} ntest个类作为 C t e s t C_{test} Ctest;
2)从training set里为 C t e s t C_{test} Ctest中的每个类选取 n f e w n_{few} nfew个样本组成support set S = { ( x i , y i ) , i = 1 , … , n f e w × n t e s t } S=\{(x_i, y_i), i=1,\dots,n_{few} \times n_{test} \} S={(xi,yi),i=1,…,nfew×ntest};
3)从 D t e s t D_{test} Dtest里选取query set。
训练阶段:
得到每个类的局部类别表示,计算注册损失:
V
i
=
[
v
i
1
,
.
.
.
,
v
i
N
]
T
V_i = [v_i^1, ..., v_i^N]^T
Vi=[vi1,...,viN]T表示局部类别表示和全局类别表示的相似度分数,过一个softmax得到,概率分布
P
i
=
[
p
i
1
,
.
.
.
,
p
i
N
]
T
P_i = [p_i^1, ..., p_i^N]^T
Pi=[pi1,...,piN]T,利用加权求和得到support set中所有类别的估计类别表示,即,
ξ
i
=
P
i
G
ξ_i = P_iG
ξi=PiG,根据得到的“全局类别表示”计算query set上的分类损失:
训练阶段的总loss如下:
测试阶段:
测试阶段,先将support set中的样本输入到特征提取网络得到所有样本的特征,然后计算每个类的局部类别表示,将这些局部类别表示和全局类别表示输入到注册模块,得到估计的全局类别表示。用
ξ
i
ξ_i
ξi进行分类。
experiment
FSL精度
GFSL
消融实验
B - 视觉特征均值作为类别表示
S1 - 用真实样本生成新样本
S2 - 用S1中的样本生成一个新的样本
R - 注册模块