O objetivo deste repositório é conter código limpo, legível e testado para reproduzir pesquisas de aprendizado de poucas fotos.
Este projeto foi escrito no Python 3.6 e Pytorch e assume que você tem uma GPU.
Veja esses artigos médios para mais informações
Listado no requirements.txt . Instale com pip install -r requirements.txt preferencialmente em um virtualenv.
Edite a variável DATA_PATH em config.py no local em que você armazena os conjuntos de dados Omniglot e MiniimageNet.
Depois de adquirir os dados e executar os scripts de configuração, sua estrutura de pasta deve parecer
DATA_PATH/
Omniglot/
images_background/
images_evaluation/
miniImageNet/
images_background/
images_evaluation/
DataSet Omniglot . Faça o download de https://github.com/brendenlake/omniglot/tree/master/python, coloque os arquivos extraídos em DATA_PATH/Omniglot_Raw e execute scripts/prepare_omniglot.py
conjunto de dados de miniimagenet . Faça o download de arquivos de https://drive.google.com/file/d/0b3irx3uqnobmq1flnxjszudywee/view, coloque em data/miniImageNet/images e run scripts/prepare_mini_imagenet.py
Depois de adicionar os conjuntos de dados, execute pytest no diretório raiz para executar todos os testes.
Os experiments/experiments.txt de arquivo.txt contém os hiperparâmetros que eu usei para obter os resultados fornecidos abaixo.

Execute experiments/proto_nets.py para reproduzir resultados de redes prototpyical para aprendizado de poucos tiro (Snell et al).
Argumentos
| Omniglot | ||||
|---|---|---|---|---|
| K-Way | 5 | 5 | 20 | 20 |
| n-shot | 1 | 5 | 1 | 5 |
| Publicado | 98.8 | 99.7 | 96.0 | 98.9 |
| Este repo | 98.2 | 99.4 | 95.8 | 98.6 |
| Miniimagenet | ||
|---|---|---|
| K-Way | 5 | 5 |
| n-shot | 1 | 5 |
| Publicado | 49.4 | 68.2 |
| Este repo | 48.0 | 66.2 |
Um classificador de vizinhos mais próximos diferenciável.

Execute experiments/matching_nets.py para reproduzir resultados de redes correspondentes para um aprendizado de um tiro (Vinyals et al).
Argumentos
Tive problemas para reproduzir os resultados deste artigo usando a métrica de distância cosseno, pois achei que o converge era lento e final de desempenho dependente da inicialização aleatória. No entanto, consegui reproduzir (e exceder ligeiramente) os resultados deste artigo usando a métrica de distância L2.
| Omniglot | ||||
|---|---|---|---|---|
| K-Way | 5 | 5 | 20 | 20 |
| n-shot | 1 | 5 | 1 | 5 |
| Publicado (Cosine) | 98.1 | 98.9 | 93.8 | 98.5 |
| Este repo (cosseno) | 92.0 | 93.2 | 75.6 | 77.8 |
| Este repo (L2) | 98.3 | 99.8 | 92.8 | 97.8 |
| Miniimagenet | ||
|---|---|---|
| K-Way | 5 | 5 |
| n-shot | 1 | 5 |
| Publicado (Cosine, FCE) | 44.2 | 57.0 |
| Este repo (cosseno, fce) | 42.8 | 53.6 |
| Este repo (L2) | 46.0 | 58.4 |

Eu usei o pool máximo em vez de convoluções atrapalhadas para ser consistente com os outros papéis. Os experimentos MiniimageNet usando Maml de 2ª Ordem me levaram a um dia para correr.
Execute experiments/maml.py para reproduzir os resultados da meta-aprendizagem modelo-agnóstica (Finn et al).
Argumentos
NB: Para maml n, k e q são fixados entre o trem e o teste. Pode ser necessário ajustar o tamanho de meta-lotes para se ajustar à sua GPU. 2ª ordem MAML usa muito mais memória.
| Omniglot | ||||
|---|---|---|---|---|
| K-Way | 5 | 5 | 20 | 20 |
| n-shot | 1 | 5 | 1 | 5 |
| Publicado | 98.7 | 99.9 | 95.8 | 98.9 |
| Este repo (1) | 95.5 | 99.5 | 92.2 | 97.7 |
| Este repo (2) | 98.1 | 99.8 | 91.6 | 95.9 |
| Miniimagenet | ||
|---|---|---|
| K-Way | 5 | 5 |
| n-shot | 1 | 5 |
| Publicado | 48.1 | 63.2 |
| Este repo (1) | 46.4 | 63.3 |
| Este repo (2) | 47.5 | 64.7 |
O número entre colchetes indica 1ª ou 2ª ordem MAML.