Код-ревью 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 на валидации не ошибка для точности, но бесполезен и мешает сопоставлять предсказания.

Что должен найти ревьюер

  1. Ошибкастрока 2
    Случайный кроп на валидации делает метрику шумной: нужен детерминированный Resize и CenterCrop.
  2. Ошибкастрока 3
    Случайное отражение на валидации: преобразования должны быть фиксированными.
  3. Стильстрока 4
    Нет нормализации входа, хотя модель (если предобученная) ждёт Normalize с теми же средними и std, что на трейне.
  4. Ошибкастрока 8
    Нет model.eval(): dropout и BatchNorm работают в режиме обучения.
  5. Производительностьстрока 10
    Нет torch.no_grad() или inference_mode(): строится граф и тратится память.
  6. Ошибкастрока 13
    Делит на число батчей, а не на число объектов: нужно len(val_loader.dataset); плюс .item(), чтобы вернуть число, а не тензор на GPU.

Разбор

Валидация должна быть детерминированной и повторять предобработку прода: фиксированный resize, нормализация как в обучении, model.eval(), no_grad, точность по числу объектов. shuffle=True на валидации не ошибка для точности, но бесполезен и мешает сопоставлять предсказания.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме