Learning to Self-Train for Semi-Supervised Few-Shot Classification
This repository contains the TensorFlow implementation for NeurIPS 2019 Paper "Learning to Self-Train for Semi-Supervised Few-Shot Classification".
Check the few-shot classification leaderboard.
Summary
Installation
In order to run this repository, we advise you to install python 2.7 or 3.5 and TensorFlow 1.3.0 with Anaconda.
You may download Anaconda and read the installation instruction on their official website: https://www.anaconda.com/download/
Create a new environment and install tensorflow on it:
conda create --name lst-tf python=2.7
conda activate lst-tf
conda install tensorflow-gpu=1.3.0
Install other requirements:
pip install scipy tqdm opencv-python pillow matplotlib
Clone this repository:
git clone https://github.com/xinzheli1217/learning-to-self-train.git
cd learning-to-self-train
Project Architecture
.
├── data_generator # dataset generator
| └── meta_data_generator.py # data genertor for meta-train phase
├── models # tensorflow model files
| ├── models.py # resnet12 CNN class
| └── meta_model_LST.py # semi-supervised meta-train model class
├── trainer # tensorflow trianer files
| └── meta_LST.py # semi-supervised meta-train trainer class
├── utils # a series of tools used in this repo
| └── misc.py # miscellaneous tool functions
|
├── data # the folder containing datasets for experiments
├── pretrain_weights_dir # the folder containing MTL pre-training weights
├── weights_saving_dir # the folder containing meta-training weights
├── test_output_dir # the folder containing meta-testing files
├── filenames_and_labels # the folder containing image file paths and labels for experiments
|
├── exp_train.py # the python file with main function and parameter settings for meta-training
└── exp_test.py # the python file with main function and parameter settings for meta-testing
Running Experiments
First, download our processed images: miniImagenet[Download Page] or tieredImagenet[Download Page], move the unziped folder to ./data. And then download the pre-trained models: miniImagenet[Download Page] or tieredImagenet[Download Page], move the unziped folder to ./pretrain_weights_dir.
Training from Pre-Trained Models
Run semi-supervised meta-train phase (e.g. 𝑚𝑖𝑛𝑖ImageNet, 1-shot) :
python exp_train.py --shot_num=1 --dataset='miniImagenet' --pretrain_class_num=64 --nb_ul_samples=10 --metatrain_iterations=15000 --exp_name='LST_mini_1_shot'
Run semi-supervised meta-test phase (e.g. 𝑚𝑖𝑛𝑖ImageNet, 1-shot) :
python exp_test.py --shot_num=1 --dataset='miniImagenet' --pretrain_class_num=64 --use_distractors=False --nb_ul_samples=100 --unfiles_num=10 --test_iter=15000 --recurrent_stage_nums=6 --nums_in_folders=30 --hard_selection=20 --exp_name='LST_mini_1_shot'
Hyperparameters and Options
There are some main hyperparameters used in the experiments, you can edit them in the exp_train.py and the exp_test.py file for meta-train and meta-test phase respectively. There are two kinds of hyperparameters: (1) common hyperparameters that shared with meta-train and meta-test, (2) test-specific hyperparameters that used for recurrent self-training process in meta-test.
-
Common hyperparameters:
way_numnumber of classesshot_numnumber of examples per classdatasetdataset used in the experiment (miniImagenet or tieredImagenet)pretrain_class_numnumber of meta-train classesexp_namename for the current experimentmeta_batch_sizenumber of tasks sampled per meta-update in meta-train phasebase_lrstep size alpha for inner gradient updatemeta_lrthe meta learning rate for SS and initial model parametersmin_meta_lrthe min meta learning rate for all meta-parametersswn_lrthe meta learning rate for SWNnb_ul_samplesnumber of unlabeled examples per classre_train_epoch_numnumber of re-training inner gradient updatestrain_base_epoch_numnumber of total inner gradient updates during train (meta-train only)test_base_epoch_numnumber of total inner gradient updates during test (meta-test only)
-
Test-specific hyperparameters:
use_distractorsif using distractor classes during meta-testnum_disnumber of distracting classes used for meta-testingunfiles_numnumber of unlabeled sample files used in the experiment (There are 10 unlabeled samples per class in each file)recurrent_stage_numsnumber of recurrent stages used during meta-testlocal_update_numnumber of inner gradient updates used in each recurrent stagenums_in_foldersnumber of unlabeled samples (per class) used in each recurrent stagehard_selectionnumber of remaining samples (per class) after applying hard-selection
If you want to change other settings, please see the comments and descriptions in exp_train.py and exp_test.py.
Performance
| (%) | 𝑚𝑖𝑛𝑖 | 𝒕𝒊𝒆𝒓𝒆𝒅 | 𝑚𝑖𝑛𝑖 (w/D) | 𝒕𝒊𝒆𝒓𝒆𝒅 (w/D) |
|---|---|---|---|---|
| 1-shot | 70.1 ± 1.9 |
77.7 ± 1.6 |
64.1 ± 1.9 |
73.5 ± 1.6 |
| 5-shot | 78.7 ± 0.8 |
85.2 ± 0.8 |
77.4 ± 1.8 |
83.4 ± 0.8 |
Citation
Please cite our paper if it is helpful to your work:
@inproceedings{li2019lst,
title={Learning to Self-Train for Semi-Supervised Few-Shot Classification},
author = {Li, Xinzhe and Sun, Qianru and Liu, Yaoyao and Zhou, Qin and Zheng, Shibao and Chua, Tat-Seng and Schiele, Bernt},
booktitle={NeurIPS},
year={2019}
}
Acknowledgements
Our implementations use the source code from the following repositories and users: