Код-ревью Middle Регуляризация обновлено
Ревью: подсчёт метрики на валидации
Вопрос
Найдите ошибки в функции валидации классификатора изображений.
val_tf = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
])
val_loader = DataLoader(val_ds, batch_size=64, shuffle=True)
def evaluate(model):
correct = 0
for x, y in val_loader:
logits = model(x.cuda())
correct += (logits.argmax(1) == y.cuda()).sum()
return correct / len(val_loader)
Коротко
Валидация должна быть детерминированной и повторять предобработку прода: фиксированный resize, нормализация как в обучении, model.eval(), nograd, точность по числу объектов. shuffle=True на валидации не ошибка для точности, но бесполезен и мешает сопоставлять предсказания.
Что должен найти ревьюер
- Ошибкастрока 2Случайный кроп на валидации делает метрику шумной: нужен детерминированный Resize и CenterCrop.
- Ошибкастрока 3Случайное отражение на валидации: преобразования должны быть фиксированными.
- Стильстрока 4Нет нормализации входа, хотя модель (если предобученная) ждёт Normalize с теми же средними и std, что на трейне.
- Ошибкастрока 8Нет model.eval(): dropout и BatchNorm работают в режиме обучения.
- Производительностьстрока 10Нет torch.no_grad() или inference_mode(): строится граф и тратится память.
- Ошибкастрока 13Делит на число батчей, а не на число объектов: нужно len(val_loader.dataset); плюс .item(), чтобы вернуть число, а не тензор на GPU.
Разбор
Валидация должна быть детерминированной и повторять предобработку прода: фиксированный resize, нормализация как в обучении, model.eval(), no_grad, точность по числу объектов. shuffle=True на валидации не ошибка для точности, но бесполезен и мешает сопоставлять предсказания.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.