This repository contains the code for LaplacianShot. The code is adapted from SimpleShot github.
More details in the following ICML 2020 paper:
Laplacian Regularized Few-shot Learning
Imtiaz Masud Ziko, Jose Dolz, Eric Granger and Ismail Ben Ayed
In ICML 2020.
We propose LaplacianShot for few-shot learning tasks, which integrates two types of potentials: (1) assigning query samples to the nearest class prototype, and (2) pairwise Laplacian potentials encouraging nearby query samples to have consistent predictions.
LaplacianShot is utilized during inference in few-shot scenarios, following the traditional training of a deep convolutional network on the base classes with the cross-entropy loss. In fact, LaplacianShot can be utilized during inference on top of any learned feature embeddings.
pip install -r requirements.txt
You can download the dataset from here. Unpack the dataset in to data/ directory.
You can download the Tiered-ImageNet from here. Unpack this dataset in data/ directory. Then run the following script to generate split files.
python src/utils/tieredImagenet.py --data path-to-tiered --split split/tiered/
Download and unpack the CUB 200-2011 from here in data/ directory. Then run the following script to generate split files.
python src/utils/cub.py --data path-to-cub --split split/cub/
We follow the instruction from https://github.com/daviswer/fewshotlocal. Download and unpack the iNat2017 Training and validation images, and the Training bounding box annotations, to data/iNat directory from here. Also download traincatlist.pth and testcatlist.pth in the same directory from here. Then, run the following to setup the dataset:
cd ./data/iNat
python iNat_setup.py
And run the following script to generate the split files.
python ./src/inatural_split.py --data path-to-inat/setup --split ./split/inatural/
You can download the pretrained network models from here.
Alternatively to train the network on the base classes from scratch remove the "--evaluate " options in the following script. The scripts to test LaplacianShot:
sh run.sh
You can change the commented options accordingly for each dataset. Also all the different options are fairly described in the configuration.py file.
We get the following results in different few-shot benchmarks:
With WRN network:
Methods | 1-shot | 5-shot |
---|---|---|
ProtoNet (Snell et al., 2017) | 62.60 | 79.97 |
CC+rot (Gidaris et al., 2019) | 62.93 | 79.87 |
MatchingNet (Vinyals et al., 2016) | 64.03 | 76.32 |
FEAT (Ye et al., 2020) | 65.10 | 81.11 |
Transductive tuning (Dhillon et al., 2020) | 65.73 | 78.40 |
SimpleShot (Wang et al., 2019) | 65.87 | 82.09 |
SIB (Hu et al., 2020) | 70.0 | 79.2 |
BD-CSPN (Liu et al., 2019) | 70.31 | 81.89 |
LaplacianShot (ours) | 73.44 | 83.93 |
With WRN network:
Methods | 1-shot | 5-shot |
---|---|---|
CC+rot (Gidaris et al., 2019) | 70.53 | 84.98 |
FEAT (Ye et al., 2020) | 70.41 | 84.38 |
Transductive tuning (Dhillon et al., 2020) | 73.34 | 85.50 |
SimpleShot (Wang et al., 2019) | 70.90 | 85.76 |
BD-CSPN (Liu et al., 2019) | 78.74 | 86.92 |
LaplacianShot (ours) | 78.80 | 87.48 |
With ResNet-18 network
Methods | 1-shot | 5-shot |
---|---|---|
MatchingNet (Vinyals et al., 2016) | 73.49 | 84.45 |
MAML (Finn et al., 2017) | 68.42 | 83.47 |
ProtoNet (Snell et al., 2017) | 72.99 | 86.64 |
RelationNet (Sung et al., 2018) | 68.58 | 84.05 |
Chen (Chen et al., 2019) | 67.02 | 83.58 |
SimpleShot (Wang et al., 2019) | 70.28 | 86.37 |
LaplacianShot (ours) | 79.90 | 88.69 |
With WRN network Top-1 accuracy Per Class and Top-1 accuracy Mean:
Methods | Per Class | Mean |
---|---|---|
SimpleShot (Wang et al., 2019) | 62.44 | 65.08 |
LaplacianShot (ours) | 71.55 | 74.97 |