简单的替代实现Pytorch中的原型网络,用于少数拍摄学习(纸,代码)。
As shown in the reference paper Prototypical Networks are trained to embed samples features in a vectorial space, in particular, at each episode (iteration), a number of samples for a subset of classes are selected and sent through the model, for each subset of class c a number of samples' features ( n_support ) are used to guess the prototype (their barycentre coordinates in the vectorial space) for that class, so then the distances between the remaining n_query样品及其类Barycentre可以最小化。

训练后,您可以计算模型生成的特征的T-SNE(在此存储库中不完成,在此处进行更多有关T-SNE的信息),这是本文所示的样本。

感谢@ludc的贡献:Pytorch/Vision#46。如果不暗示代码的大更改,我们将使用官方数据集将其添加到torchvision中。
我们像[匹配一个镜头学习的匹配网络]中实现了Vynials分裂方法。这应该与论文中使用的方法相同(实际上,我从“公开”仓库中下载了拆分文件)。然后,我们在其中描述了相同的旋转。通过这种方式,我们应该能够比较通过运行此代码与参考文件中描述的结果获得的结果。
如PYDOC中所述,该类用于生成每批索引的原型训练算法。
特别是,该对象是通过传递数据集的标签列表来实例化的,采样器渗透了类,然后为每个类的总数,并为每个类NI的数据集创建一组索引。在每个情节中,采样器选择n_classes随机类,并返回每个选定类的样本索引的数字( n_support + n_query )。
按照引用的论文计算损失,主要是由其一位作者启发的。
在prototypical_loss.py中,实施了损失函数和损失类别。
该函数从模型中输入批处理输入,示例的地面真相以及用于用作支持样本的样本的数字n_suppport 。从目标列表中推断情节类, n_support样品为每个类随机提取,计算其类的barycentres,以及每个剩余的样本中每个班级嵌入的距离的距离,以及每个情节类别的每个样本的概率,都计算出每个情节类别的范围;然后,从分类问题中的往常中,从错误的预测概率(对于查询样本)计算出损失。
请注意,培训代码仅出于演示目的。
要在此任务上训练Protonet,请将CD介绍到该仓库的src根文件夹中并执行:
$ python train.py
该脚本采用以下命令行选项:
dataset_root :存储数据集的根目录,默认为'../dataset'
nepochs :训练的时期数量,默认为100
learning_rate :模型的学习率,默认为0.001
lr_scheduler_step :Steplr学习率调度程序步骤,默认为20
lr_scheduler_gamma :Steplr学习率调度程序伽玛,默认为0.5
iterations :每个时期的发作数。默认为100
classes_per_it_tr :训练每集的随机类数量。默认为60
num_support_tr :每个课程的样本数量用于培训。默认为5
num_query_tr :每班样本的nnumber用作培训的查询。默认为5
classes_per_it_val :每集的随机类数量进行验证。默认为5
num_support_val :每个类的样本数量用于验证。默认为5
num_query_val :每个类的样本数量用于查询验证。默认为15
manual_seed :手动种子初始化的输入,默认为7
cuda :启用CUDA(商店True )
在没有参数的情况下运行命令将使用默认的超参数值训练模型(上面显示的结果)。
我们正在尝试重现参考纸表演,我们将在此处更新我们的最佳结果。
| 模型 | 1-shot(5向Acc。) | 5-shot(5-way Acc。) | 1 -shot(20向上ACC。) | 5-shot(20向上ACC。) |
|---|---|---|---|---|
| 参考文件 | 98.8% | 99.7% | 96.0% | 98.9% |
| 这个存储库 | 98.5%** | 99.6%* | 95.1%° | 98.6%° |
*使用默认参数实现(使用--cuda选项)
**实现了运行python train.py --cuda -nsTr 1 -nsVa 1
°实现了运行python train.py --cuda -nsTr 1 -nsVa 1 -cVa 20
°°实现了python train.py --cuda -nsTr 5 -nsVa 5 -cVa 20
引用纸张如下(为您复制从Arxiv复制):
@article{DBLP:journals/corr/SnellSZ17,
author = {Jake Snell and
Kevin Swersky and
Richard S. Zemel},
title = {Prototypical Networks for Few-shot Learning},
journal = {CoRR},
volume = {abs/1703.05175},
year = {2017},
url = {http://arxiv.org/abs/1703.05175},
archivePrefix = {arXiv},
eprint = {1703.05175},
timestamp = {Wed, 07 Jun 2017 14:41:38 +0200},
biburl = {http://dblp.org/rec/bib/journals/corr/SnellSZ17},
bibsource = {dblp computer science bibliography, http://dblp.org}
}
该项目已根据麻省理工学院许可证
版权(C)2018 Daniele E. Ciriello,Orobix SRL(www.orobix.com)。