论文链接:http://openaccess.thecvf.com/content_CVPR_2019/papers/Huang_Generative_Dual_Adversarial_Network_for_Generalized_Zero-Shot_Learning_CVPR_2019_paper.pdf
创新:论文提出了一个新颖的模型,该模型为三种不同的方法提供了统一的框架:视觉→语义映射,语义→视觉映射和深度度量学习。
模型包含一个生成器网络,它能够生成以类嵌入为条件的图像特征;一个回归器网络,它获取图像特征并输出其类嵌入(即语义特征);以及一个鉴别器网络,其将图像特征和语义特征作为输入,并输出一个分数,以表明它们彼此的匹配程度。生成器和回归器通过循环一致性损失相互学习,而它们两者也通过双重对抗性损失与鉴别器交互。三个网络均使用前馈网络模型。
背景:如图1(a)所示,大多数现有方法将视觉特征投射到类属性所跨越的语义空间。然而,使用语义空间作为共享的潜在空间将遭受hubness problem的困扰,即将高维视觉特征投影到低维空间将大大减少特征的差异,结果可能聚集成一个中心。为了减轻这个问题,一些方法提议将语义特征投影到视觉空间中,如图1(b)的左侧所示。但是,使用确定性方法将类别的语义嵌入映射到视觉空间仍然是有问题的,因为一个类别标签具有许多对应的视觉特征。相反,一些最新的著作建议使用生成方法,这些方法可以生成基于语义特征向量的各种视觉特征,如图1(b)的右侧所示。尽管它们有效,但由于缺乏学习视觉空间和语义空间之间的双向映射的能力或缺乏对抗性损失(作为评估特征相似性的更灵活指标)的效果受到限制。代替人工选择一个公共的潜在空间,RelationNet 提议学习一个深度度量网络,该网络以一对视觉和语义特征作为输入并输出它们的相似性,如图1(c)所示。但是,RelationNet 无法学习图像和类的潜在特征,也不支持半监督学习。
三部分网络详细介绍:
CVAE-G生成器:参考CVAE-GAN
Regressor回归器:自己有一个 supervised loss,
除此之外,Regressor与CVAE交互时会出现以下循环一致性损失:
Discriminator判别器:
D有四种输入,①(v, s) :真实特征和其对应的真实语义 ②(G(s, z), s) :生成特征和真实语义 ③(v,R(v)):真实特征和生成语义 ④ (v, s−):是一个随机的语义向量,且,,即真实特征和不对应的真实语义
式中几项与上面输入输出对应,由此,CVAE和Regressor的对抗损失还可以定义为:
训练:
鉴别器是与其他两个网络分开训练的,首先使用公式2进行CVAE的预训练,然后使用公式5和公式8以对抗的方式训练整个模型。
实验:
训练完模型后,为了预测未见类别的标签,为每个未见类别首先生成新样本,然后将这些合成样本与训练数据中的其他样本合并,之后可以训练任何新的类别基于此新数据集,其中包含可见和不可见类的样本。 为了与其他基准进行公平比较,仅应用一个简单的1-NN分类器进行测试,该分类器用于大多数基准。
将GDAN模型在SUN ,CUB,aPY和AWA2数据集上与几个baseline方法进行比较。采用了广泛使用的平均每类的top-1准确性来评估每个模型的性能,定义如下:
在广义零镜头学习设置中,在测试阶段,我们使用可见和不可见类的图像,并且标签空间也是可见和不可见类的组合。 我们希望可见和不可见类的准确性都尽可能高,因此我们需要一个可以反映模型整体性能的指标。使用谐波平均数,令AccYs和AccYu分别表示可见和不可见类别的图像的准确性,因此可见和不可见准确性的谐波平均值H定义为:
我们将模型的CVAE,回归器和鉴别器实现为前馈神经网络。 CVAE的编码器具有两个分别为1200和600个单位的隐藏层,而CVAE的生成器和鉴别器是由800个隐藏单位的一个隐藏层实现的。 回归器只有600个单位的隐藏层。 对于所有数据集,噪声向量z的维数均设置为100。 我们使用λ1=λ2=λ3= 0.1,发现它们通常工作良好。 我们选择Adam作为优化器,动量设为(0.9,0.999)。判别器的学习率设为0.00001,而CVAE和回归器的学习率设为0.0001。 diter和giter设置为1,这意味着我们模型中的所有模块都以相同的批次数量进行训练。 我们对每个数据集训练500个epoch,每10个epoch保存一次模型检查点,然后对验证集进行评估,以找到最佳的测试集。
结果:
双重学习
可以同时训练一个主要任务和一个双重任务,其中双重任务是主要任务的逆任务。 本文的工作与CycleGAN和DualGAN有关,因为从它们那里借来了循环一致性损失。 但是,这两个模型需要两个生成网络,这使得它们不能直接应用于广义零镜头学习,因为每个类都有固定的语义表示,并且生成网络不适合视觉→语义映射,因为它可能会产生很大的差异 语义特征。 因此,需要一种新颖的架构将循环一致性纳入零击学习中。
CVAE-GAN
本文在CVAE-GAN基础上添加了回归模型,输入生成器的z并非随机噪声而是通过编码器编码的模拟所求类别的特征分布的向量。
Kullback-Leibler Divergence (KL 散度)
DKL(p||q)表示的就是概率 q与概率 p之间的差异,很显然,散度越小,说明 概率 q 与概率 p之间越接近,那么估计的概率分布于真实的概率分布也就越接近。
代码:http://www.github.com/stevehuanghe/GDAN
### 环境需要
- Python 3.6, PyTroch 0.4
- sklearn, scipy, numpy, tqdm
### 运行步骤
1. 按照要求修改配置文件
2. 预训练 CVAE,checkpoints存在配置文件里指定的"vae_dir":
运行python pretrain_gdan.py --config configs/cub.yml
3. 选择想用的CVAE checkpoint去初始化GDAN模型 并修改 yaml文件中的"vae_ckpt"变量。
运行python train_gdan.py --config configs/cub.yml训练GDAN
4.用验证数据决定使用哪个GDAN checkpoint(在配置文件yaml中的指定路径为"ckpt_dir" )
运行python valtest_gdan.py --config configs/cub.yml测试和训练
训练过程,先预训练CVAE,然后每个epoch先用G和D对抗训练D,再用G和R生成的假数据通过D训练G和R