Код-ревью Middle Эмбеддинги и fine-tuning обновлено
Ревью: дообучение предобученной модели
Вопрос
Коллега дообучает предобученный ResNet на своём датасете из 3 000 картинок. Найдите проблемы.
model = torchvision.models.resnet50(weights="IMAGENET1K_V2")
for p in model.parameters():
p.requires_grad = False
model.fc = nn.Linear(2048, num_classes)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
train_tf = transforms.Compose([transforms.Resize(224), transforms.ToTensor()])
for epoch in range(100):
model.train()
for x, y in train_loader:
optimizer.zero_grad()
loss = criterion(model(x), y)
loss.backward()
optimizer.step()
Коротко
Рецепт: нормализация как при предобучении, аугментации, сначала голова на замороженном бэкбоне с умеренным lr, затем разморозка верхних блоков с меньшим lr, валидация и early stopping.
Что должен найти ревьюер
- Стильстрока 5SGD с lr = 0.1 без momentum и расписания, и в оптимизатор переданы все параметры, хотя учится только голова: лучше передать model.fc.parameters(), подобрать lr по валидации, а при разморозке бэкбона брать lr на порядок меньше.
- Ошибкастрока 6Нет нормализации входа средними и std ImageNet, на которых предобучены веса: признаки бэкбона будут искажены.
- Стильстрока 6Нет аугментаций на трейне: на 3 000 картинок модель быстро переобучится.
- Стильстрока 7100 эпох без валидации и early stopping: переобучение никто не заметит.
- Ошибкастрока 8model.train() при замороженном бэкбоне обновляет статистики BatchNorm бэкбона на маленьком датасете; часто BN-слои держат в eval или замораживают явно.
Разбор
Рецепт: нормализация как при предобучении, аугментации, сначала голова на замороженном бэкбоне с умеренным lr, затем разморозка верхних блоков с меньшим lr, валидация и early stopping. BatchNorm при заморозке бэкбона требует внимания: requires_grad = False не останавливает обновление running_mean и running_var в режиме train.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.