CNN даёт 98% на курированной валидации и рушится на фото с телефонов — найдите и исправьте причину.
Классификатор даёт 98% на курированной валидации, но рушится на реальных фото с телефонов.
Ограничения:
- обученные веса в порядке, обучение с нуля — не ответ
- фрагмент ниже и есть весь пайплайн валидации и инференса
- фото с телефонов приходят повёрнутыми по EXIF, с плавающим балансом белого и JPEG-сжатием
train_tf = Compose([Resize((224, 224)), ToTensor(),
Normalize(MEAN_IMAGENET, STD_IMAGENET)])
infer_tf = Compose([Resize((256, 256)), CenterCrop(224), ToTensor()])
val_ds = ImageFolder("data/studio_shots", transform=train_tf)
Найдите причины и укажите исправление.
Валидация состоит только из студийных снимков и не видит распределения продакшена, а инференс пропускает нормализацию, с которой модель обучалась. Исправьте оба — привести преобразование инференса к обучающему и валидировать на реальных фото.
- ✗Называют это переобучением, хотя нерепрезентативна сама оценочная выборка
- ✗Думают, что нормализация важна только при обучении
- ✗Перенастраивают порог на выборке с тем же неверным распределением
- →Как отслеживать сдвиг распределения входов в продакшене?
- →Почему преобразование на инференсе должно совпадать с обучающим?
Две независимые причины, и обе видны во фрагменте.
Первая — infer_tf не содержит Normalize. Модель обучалась на входах, приведённых к статистикам ImageNet, а на инференсе получает сырые значения из ToTensor в диапазоне 0–1. Одного этого хватает, чтобы предсказания развалились. Заодно расходится и путь ресайза: Resize((224, 224)) при обучении против Resize((256, 256)) + CenterCrop(224) на инференсе.
Вторая — val_ds собран только из data/studio_shots. Валидация измеряет ту же курированную съёмку, на которой училась модель, поэтому 98% не говорят ничего о продакшене.
infer_tf = Compose([Resize((224, 224)), ToTensor(),
Normalize(MEAN_IMAGENET, STD_IMAGENET)])
val_ds = ImageFolder("data/phone_holdout", transform=infer_tf)
Дальше: применять EXIF-поворот при загрузке и добавить в обучение аугментации, отражающие реальные условия — JPEG-сжатие, сдвиг баланса белого, лёгкое размытие. Это сужает сдвиг распределения, а не только измеряет его.