Unsicherheitssätze für Bildklassifikatoren mit konformer Vorhersage
@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}
}
Diese Codebasis modifiziert jeden PyTorch-Klassifikator, um einen Vorhersagesatz auszugeben, der nachweislich die wahre Klasse mit einer von Ihnen angegebenen Wahrscheinlichkeit enthält. Es verwendet eine Methode namens Regularized Adaptive Prediction Sets (RAPS), die wir in unserem Begleitpapier vorstellen. Das Verfahren ist so einfach und schnell wie die Platt-Skalierung, bietet jedoch eine formale Abdeckungsgarantie für endliche Stichproben für jedes Modell und jeden Datensatz.
Beispiele für Vorhersagesätze auf Imagenet. Wir zeigen drei Beispiele der Klasse Fuchshörnchen zusammen mit 95 %-Vorhersagesätzen, die mit unserer Methode generiert wurden, um zu veranschaulichen, wie sich die Satzgröße basierend auf der Schwierigkeit eines Testzeitbilds ändert. Wir haben ein Colab geschrieben, mit dem Sie RAPS
und konforme Klassifizierung erkunden können. Sie müssen nichts installieren, um Colab auszuführen. Das Notizbuch führt Sie durch die Erstellung von Vorhersagesätzen aus einem vorab trainierten Modell. Sie können auch Beispiele aus ImageNet zusammen mit den entsprechenden RAPS
Sets visualisieren und mit den Regularisierungsparametern experimentieren.
Sie können auf das Colab zugreifen, indem Sie auf das Schild unten klicken.
Wenn Sie unseren Code in Ihren eigenen Projekten verwenden und unsere Experimente reproduzieren möchten, stellen wir Ihnen die folgenden Tools zur Verfügung. Beachten Sie, dass unsere Codebasis zwar kein Paket ist, es aber einfach ist, sie wie ein Paket zu verwenden, und wir tun dies im Colab-Notizbuch oben.
Installieren Sie die Abhängigkeiten aus dem Stammverzeichnis und führen Sie unser Beispiel aus, indem Sie Folgendes ausführen:
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/'
Schauen Sie in example.py
nach einem Minimalbeispiel, das einen vorab trainierten Klassifikator so ändert, dass er 90 % Vorhersagesätze ausgibt.
Wenn Sie unsere Codebasis für Ihr eigenes Modell verwenden möchten, platzieren Sie dies zunächst oben in Ihrer Datei:
from conformal.py import *
from utils.py import *
Erstellen Sie dann einen Holdout-Satz für die konforme Kalibrierung mit einer Zeile wie:
calib, val = random_split(mydataset, [num_calib,total-num_calib])
Abschließend können Sie das Modell erstellen
model = ConformalModel(model, calib_loader, alpha=0.1, lamda_criterion='size')
Das ConformalModel
Objekt akzeptiert ein boolesches Flag randomized
. Bei randomized=True
werden die Sätze zum Testzeitpunkt nicht randomisiert. Dies wird zu einer konservativen Abdeckung, aber deterministischem Verhalten führen.
Das ConformalModel
Objekt benötigt ein zweites boolesches allow_zero_sets
. Wenn allow_zero_sets=True
zum Testzeitpunkt gilt, sind Sätze der Größe Null nicht zulässig. Dies führt zu einer konservativen Abdeckung, jedoch nicht zu Sätzen mit Nullgröße.
Informationen zur manuellen Auswahl von alpha
, kreg
und lamda
finden Sie in der folgenden Diskussion.
Die Ausgabe von example.py
sollte sein:
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!
Die Werte in Klammern sind laufende Durchschnittswerte. Die vorangehenden Werte gelten nur für die aktuellste Charge. Die Timing-Werte werden auf Ihrem System unterschiedlich sein, aber die restlichen Zahlen sollten genau gleich sein. Der Fortschrittsbalken wird möglicherweise über viele Zeilen gedruckt, wenn Ihr Terminalfenster klein ist.
Die erwarteten Ergebnisse der Experimente werden in experiments/outputs
gespeichert und sind genau identisch mit den in unserer Arbeit berichteten Ergebnissen. Sie können die Ergebnisse reproduzieren, indem Sie die Python-Skripte in „./experiments/“ ausführen, nachdem Sie unsere Abhängigkeiten installiert haben. Für Tabelle 2 haben wir die matched-frequencies
Version von ImageNet-V2 verwendet.
alpha
, kreg
und lamda
alpha
ist der maximale Anteil an Fehlern, den Sie bereit sind zu tolerieren. Die Zielabdeckung beträgt daher 1-alpha
. Ein kleinerer alpha
führt normalerweise zu größeren Sätzen, da die gewünschte Abdeckung strenger ist.
Wir haben zwei optimale Verfahren zum Auswählen von „kreg“ und „lamda“ eingefügt. Wenn Sie Sätze mit kleiner Größe wünschen, legen Sie „lamda_criterion='size“ fest. Wenn Sie Sätze wünschen, die der bedingten Abdeckung nahekommen, legen Sie „lamda_criterion='adaptiveness“ fest.
MIT-Lizenz