Ensembles d'incertitudes pour les classificateurs d'images utilisant la prédiction 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}
}
Cette base de code modifie n'importe quel classificateur PyTorch pour générer un ensemble prédictif qui contient de manière prouvée la vraie classe avec une probabilité que vous spécifiez. Il utilise une méthode appelée Ensembles de prédiction adaptative régularisés (RAPS), que nous présentons dans notre article d'accompagnement. La procédure est aussi simple et rapide que la mise à l'échelle de Platt, mais offre une garantie formelle de couverture d'échantillons finis pour chaque modèle et ensemble de données.
Exemples d’ensembles de prédiction sur Imagenet. nous montrons trois exemples de la classe écureuil renard ainsi que des ensembles de prédictions à 95 % générés par notre méthode pour illustrer comment la taille de l'ensemble change en fonction de la difficulté d'une image au moment du test. Nous avons écrit un Colab qui vous permet d'explorer RAPS
et la classification conforme. Vous n'avez rien à installer pour exécuter Colab. Le cahier vous guidera dans la construction d'ensembles prédictifs à partir d'un modèle pré-entraîné. Vous pouvez également visualiser des exemples d'ImageNet avec leurs ensembles RAPS
correspondants et jouer avec les paramètres de régularisation.
Vous pouvez accéder au Colab en cliquant sur le bouclier ci-dessous.
Si vous souhaitez utiliser notre code dans vos propres projets et reproduire nos expériences, nous mettons à votre disposition les outils ci-dessous. Notez que même si notre base de code n'est pas un package, il est facile de l'utiliser comme un package, et nous le faisons dans le notebook Colab ci-dessus.
Depuis le répertoire racine, installez les dépendances et exécutez notre exemple en exécutant :
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/'
Regardez dans example.py
pour un exemple minimal qui modifie un classificateur pré-entraîné pour générer des ensembles de prédictions à 90 %.
Si vous souhaitez utiliser notre base de code sur votre propre modèle , placez d'abord ceci en haut de votre fichier :
from conformal.py import *
from utils.py import *
Créez ensuite un ensemble d'exclusions pour l'étalonnage conforme en utilisant une ligne telle que :
calib, val = random_split(mydataset, [num_calib,total-num_calib])
Enfin, vous pouvez créer le modèle
model = ConformalModel(model, calib_loader, alpha=0.1, lamda_criterion='size')
L'objet ConformalModel
prend un indicateur booléen randomized
. Lorsque randomized=True
, au moment du test, les ensembles ne seront pas randomisés. Cela conduira à une couverture conservatrice, mais à un comportement déterministe.
L'objet ConformalModel
prend un deuxième indicateur booléen allow_zero_sets
. Lorsque allow_zero_sets=True
, au moment du test, les ensembles de taille zéro ne sont pas autorisés. Cela conduira à une couverture conservatrice, mais pas à des ensembles de taille nulle.
Voir la discussion ci-dessous pour sélectionner manuellement alpha
, kreg
et lamda
.
Le résultat de example.py
devrait être :
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!
Les valeurs entre parenthèses sont des moyennes glissantes. Les valeurs précédentes concernent uniquement le lot le plus récent. Les valeurs de synchronisation seront différentes sur votre système, mais le reste des nombres devrait être exactement le même. La barre de progression peut s'imprimer sur plusieurs lignes si la fenêtre de votre terminal est petite.
Les résultats attendus des expériences sont stockés dans experiments/outputs
et ils sont exactement identiques aux résultats rapportés dans notre article. Vous pouvez reproduire les résultats en exécutant les scripts python dans './experiments/' après avoir installé nos dépendances. Pour le tableau 2, nous avons utilisé la version matched-frequencies
d'ImageNet-V2.
alpha
, kreg
et lamda
alpha
est la proportion maximale d'erreurs que vous êtes prêt à tolérer. La couverture cible est donc 1-alpha
. Un alpha
plus petit conduira généralement à des ensembles plus grands, puisque la couverture souhaitée est plus stricte.
Nous avons inclus deux procédures optimales pour la sélection de « kreg » et de « lamda ». Si vous souhaitez des ensembles de petite taille, définissez 'lamda_criterion='size''. Si vous souhaitez définir une couverture conditionnelle approximative, définissez 'lamda_criterion='adaptiveness''.
Licence MIT