Conjuntos de incertezas para classificadores de imagens usando previsão conforme
@article{angelopoulos2020sets,
title={Uncertainty Sets for Image Classifiers using Conformal Prediction},
author={Angelopoulos, Anastasios N and Bates, Stephen and Malik, Jitendra and Jordan, Michael I},
journal={arXiv preprint arXiv:2009.14193},
year={2020}
}
Esta base de código modifica qualquer classificador PyTorch para gerar um conjunto preditivo que provavelmente contém a classe verdadeira com uma probabilidade que você especifica. Ele usa um método chamado Conjuntos de Predição Adaptativa Regularizados (RAPS), que apresentamos em nosso artigo acompanhante. O procedimento é tão simples e rápido quanto o escalonamento de Platt, mas fornece uma garantia formal de cobertura de amostras finitas para cada modelo e conjunto de dados.
Exemplos de conjuntos de previsões no Imagenet. mostramos três exemplos da classe esquilo raposa junto com conjuntos de predição de 95% gerados por nosso método para ilustrar como o tamanho do conjunto muda com base na dificuldade de uma imagem em tempo de teste. Escrevemos um Colab que permite explorar RAPS
e a classificação conforme. Você não precisa instalar nada para executar o Colab. O notebook orientará você na construção de conjuntos preditivos a partir de um modelo pré-treinado. Você também pode visualizar exemplos do ImageNet junto com seus conjuntos RAPS
correspondentes e brincar com os parâmetros de regularização.
Você pode acessar o Colab clicando no escudo abaixo.
Se você quiser usar nosso código em seus próprios projetos e reproduzir nossos experimentos, fornecemos as ferramentas abaixo. Observe que embora nossa base de código não seja um pacote, é fácil usá-la como um pacote, e fazemos isso no notebook Colab acima.
No diretório raiz, instale as dependências e execute nosso exemplo executando:
git clone https://github.com/aangelopoulos/conformal-classification
cd conformal-classification
conda env create -f environment.yml
conda activate conformal
python example.py 'path/to/imagenet/val/'
Procure em example.py
um exemplo mínimo que modifica um classificador pré-treinado para gerar conjuntos de predições de 90%.
Se você quiser usar nossa base de código em seu próprio modelo , primeiro coloque isto no topo do seu arquivo:
from conformal.py import *
from utils.py import *
Em seguida, crie um conjunto de validação para calibração conforme usando uma linha como:
calib, val = random_split(mydataset, [num_calib,total-num_calib])
Finalmente, você pode criar o modelo
model = ConformalModel(model, calib_loader, alpha=0.1, lamda_criterion='size')
O objeto ConformalModel
usa um sinalizador booleano randomized
. Quando randomized=True
, no momento do teste, os conjuntos não serão randomizados. Isto levará a uma cobertura conservadora, mas a um comportamento determinista.
O objeto ConformalModel
usa um segundo sinalizador booleano allow_zero_sets
. Quando allow_zero_sets=True
, em tempo de teste, conjuntos de tamanho zero não são permitidos. Isto levará a uma cobertura conservadora, mas não a conjuntos de tamanho zero.
Veja a discussão abaixo para escolher alpha
, kreg
e lamda
manualmente.
A saída de example.py
deve ser:
Begin Platt scaling.
Computing logits for model (only happens once).
100%|███████████████████████████████████████| 79/79 [02:24<00:00, 1.83s/it]
Optimal T=1.1976691484451294
Model calibrated and conformalized! Now evaluate over remaining data.
N: 40000 | Time: 1.686 (2.396) | Cvg@1: 0.766 (0.782) | Cvg@5: 0.969 (0.941) | Cvg@RAPS: 0.891 (0.914) | Size@RAPS: 2.953 (2.982)
Complete!
Os valores entre parênteses são médias correntes. Os valores anteriores são apenas para o lote mais recente. Os valores de tempo serão diferentes no seu sistema, mas o restante dos números deve ser exatamente o mesmo. A barra de progresso pode ser impressa em muitas linhas se a janela do seu terminal for pequena.
Os resultados esperados dos experimentos são armazenados em experiments/outputs
e são exatamente idênticos aos resultados relatados em nosso artigo. Você pode reproduzir os resultados executando os scripts python em './experiments/' depois de instalar nossas dependências. Para a Tabela 2, usamos a versão matched-frequencies
do ImageNet-V2.
alpha
, kreg
e lamda
alpha
é a proporção máxima de erros que você está disposto a tolerar. A cobertura alvo é, portanto, 1-alpha
. Um alpha
menor normalmente levará a conjuntos maiores, uma vez que a cobertura desejada é mais rigorosa.
Incluímos dois procedimentos ideais para escolher 'kreg' e 'lamda'. Se você quiser conjuntos com tamanho pequeno, defina 'lamda_criterion='size''. Se você deseja conjuntos que se aproximem da cobertura condicional, defina 'lamda_criterion='adaptiveness''.
Licença MIT