The aim for this repository is to contain clean, readable and tested code to reproduce few-shot learning research.
This project is written in python 3.6 and Pytorch and assumes you have a GPU.
See these Medium articles for some more information
requirements.txt. Install with
pip install -r requirements.txt preferably in a virtualenv.
DATA_PATH variable in
config.py to the location where
you store the Omniglot and miniImagenet datasets.
After acquiring the data and running the setup scripts your folder structure should look like
DATA_PATH/ Omniglot/ images_background/ images_evaluation/ miniImageNet/ images_background/ images_evaluation/
Omniglot dataset. Download from https://github.com/brendenlake/omniglot/tree/master/python,
place the extracted files into
DATA_PATH/Omniglot_Raw and run
miniImageNet dataset. Download files from
data/miniImageNet/images and run
After adding the datasets run
pytest in the root directory to run
experiments/experiments.txt contains the hyperparameters I
used to obtain the results given below.
experiments/proto_nets.py to reproduce results from Prototpyical
Networks for Few-shot Learning
(Snell et al).
A differentiable nearest neighbours classifier.
experiments/matching_nets.py to reproduce results from Matching
Networks for One Shot Learning
(Vinyals et al).
I had trouble reproducing the results of this paper using the cosine distance metric as I found the converge to be slow and final performance dependent on the random initialisation. However I was able to reproduce (and slightly exceed) the results of this paper using the l2 distance metric.
|This Repo (cosine)||92.0||93.2||75.6||77.8|
|This Repo (l2)||98.3||99.8||92.8||97.8|
|Published (cosine, FCE)||44.2||57.0|
|This Repo (cosine, FCE)||42.8||53.6|
|This Repo (l2)||46.0||58.4|
I used max pooling instead of strided convolutions in order to be consistent with the other papers. The miniImageNet experiments using 2nd order MAML took me over a day to run.
experiments/maml.py to reproduce results from Model-Agnostic
(Finn et al).
NB: For MAML n, k and q are fixed between train and test. You may need to adjust meta-batch-size to fit your GPU. 2nd order MAML uses a lot more memory.
|This Repo (1)||95.5||99.5||92.2||97.7|
|This Repo (2)||98.1||99.8||91.6||95.9|
|This Repo (1)||46.4||63.3|
|This Repo (2)||47.5||64.7|
Number in brackets indicates 1st or 2nd order MAML.