ชุดความไม่แน่นอนสำหรับตัวแยกประเภทรูปภาพโดยใช้การทำนายตามรูปแบบ
@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}
}
โค้ดเบสนี้จะแก้ไขตัวแยกประเภท PyTorch ใด ๆ เพื่อส่งออก ชุดการทำนาย ที่พิสูจน์ได้ว่ามีคลาสจริงที่มีความน่าจะเป็นที่คุณระบุ โดยใช้วิธีการที่เรียกว่า Regularized Adaptive Prediction Set (RAPS) ซึ่งเราแนะนำไว้ในเอกสารแนบ ขั้นตอนนี้ง่ายและรวดเร็วเหมือนกับการปรับขนาด Platt แต่ให้การรับประกันความครอบคลุมตัวอย่างจำกัดอย่างเป็นทางการสำหรับทุกรุ่นและชุดข้อมูล
ตัวอย่างชุดการทำนายบน Imagenet เราแสดงตัวอย่าง กระรอกจิ้งจอก สามตัวอย่างพร้อมกับชุดการทำนาย 95% ที่สร้างโดยวิธีการของเรา เพื่อแสดงให้เห็นว่าขนาดชุดเปลี่ยนแปลงตามความยากของภาพในเวลาทดสอบอย่างไร เราได้เขียน Colab ซึ่งช่วยให้คุณสำรวจ RAPS
และการจัดประเภทตามรูปแบบได้ คุณไม่จำเป็นต้องติดตั้งอะไรเลยเพื่อเรียกใช้ Colab สมุดบันทึกจะนำคุณไปสู่การสร้างชุดการทำนายจากแบบจำลองที่ได้รับการฝึกล่วงหน้า คุณยังสามารถแสดงภาพตัวอย่างจาก ImageNet พร้อมกับชุด RAPS
ที่เกี่ยวข้อง และเล่นกับพารามิเตอร์การทำให้เป็นมาตรฐาน
คุณเข้าถึง Colab ได้โดยคลิกที่โล่ด้านล่าง
หากคุณต้องการใช้โค้ดของเราในโครงการของคุณเองและทำซ้ำการทดลองของเรา เรามีเครื่องมือด้านล่างนี้ โปรดทราบว่าแม้ว่าโค้ดเบสของเราจะไม่ใช่แพ็กเกจ แต่ก็ใช้งานได้ง่ายเหมือนกับแพ็กเกจ และเราทำในสมุดบันทึก Colab ด้านบน
จากไดเร็กทอรีราก ให้ติดตั้งการขึ้นต่อกันและรันตัวอย่างของเราโดยดำเนินการ:
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/'
ดูภายใน example.py
เพื่อดูตัวอย่างขั้นต่ำที่ปรับเปลี่ยนตัวแยกประเภทที่ได้รับการฝึกล่วงหน้าเพื่อให้ส่งออกชุดการทำนาย 90%
หากคุณต้องการใช้โค้ดเบสของเรากับ โมเดลของคุณเอง ให้วางสิ่งนี้ไว้ที่ด้านบนของไฟล์ก่อน:
from conformal.py import *
from utils.py import *
จากนั้นสร้างชุด Holdout สำหรับการปรับเทียบมาตรฐานโดยใช้เส้นดังนี้:
calib, val = random_split(mydataset, [num_calib,total-num_calib])
ในที่สุดคุณก็สามารถสร้างโมเดลได้
model = ConformalModel(model, calib_loader, alpha=0.1, lamda_criterion='size')
วัตถุ ConformalModel
รับธงบูลีน randomized
เมื่อ randomized=True
ณ เวลาทดสอบ ชุดต่างๆ จะไม่ถูกสุ่ม สิ่งนี้จะนำไปสู่ความคุ้มครองแบบอนุรักษ์นิยม แต่เป็นพฤติกรรมที่กำหนดได้
วัตถุ ConformalModel
รับแฟล็กบูลีนที่สอง allow_zero_sets
เมื่อ allow_zero_sets=True
ขณะทดสอบ ไม่อนุญาตให้ใช้ชุดขนาดศูนย์ สิ่งนี้จะนำไปสู่การครอบคลุมแบบระมัดระวัง แต่ไม่มีชุดขนาดเป็นศูนย์
ดูการสนทนาด้านล่างสำหรับการเลือก alpha
, kreg
และ lamda
ด้วยตนเอง
ผลลัพธ์ของ example.py
ควรเป็น:
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!
ค่าในวงเล็บคือค่าเฉลี่ย ค่าก่อนหน้ามีไว้สำหรับชุดงานล่าสุดเท่านั้น ค่าเวลาจะแตกต่างกันในระบบของคุณ แต่ตัวเลขที่เหลือควรจะเหมือนกันทุกประการ แถบความคืบหน้าอาจพิมพ์เป็นหลายบรรทัดหากหน้าต่างเทอร์มินัลของคุณมีขนาดเล็ก
ผลลัพธ์ที่คาดหวังของการทดลองจะถูกจัดเก็บไว้ใน experiments/outputs
และผลลัพธ์จะเหมือนกันทุกประการกับผลลัพธ์ที่รายงานในรายงานของเรา คุณสามารถสร้างผลลัพธ์ขึ้นมาใหม่ได้โดยการรันสคริปต์ Python ใน './experiments/' หลังจากที่คุณติดตั้งการอ้างอิงของเราแล้ว สำหรับตารางที่ 2 เราใช้ ImageNet-V2 เวอร์ชัน matched-frequencies
alpha
, kreg
และ lamda
alpha
คือสัดส่วนสูงสุดของข้อผิดพลาดที่คุณยินดียอมรับ ความครอบคลุมเป้าหมายจึงเป็น 1-alpha
alpha
ที่เล็กกว่ามักจะนำไปสู่ชุดที่ใหญ่ขึ้น เนื่องจากการครอบคลุมที่ต้องการจะเข้มงวดมากกว่า
เราได้รวมขั้นตอนที่เหมาะสมที่สุดสองขั้นตอนสำหรับการเลือก 'kreg' และ 'lamda' หากคุณต้องการชุดที่มีขนาดเล็ก ให้ตั้งค่า 'lamda_criterion='size'' หากคุณต้องการตั้งค่าการครอบคลุมตามเงื่อนไขโดยประมาณ ให้ตั้งค่า 'lamda_criterion='adaptiveness''
ใบอนุญาตเอ็มไอที