Каким образом стоит поменять последний слой resnet18 чтобы улучшить accuracy?

Задача состоит в том, чтобы улучшить обычную часть архитектуры resnet18, заменив последний линейный слой модели на несколько линейных слоёв, причём имея между этими слоями слой нелинейности.

model = models.resnet18(pretrained=True)
set_requires_grad(model, False)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, num_classes) # в этом месте

Я пробовал делать следующим образом:

model.fc = nn.Sequential(nn.Flatten(), nn,Dropout(0.2), nn.Linear(num_ftrs, 128), nn.Relu(inplace=True), nn.Linear(128, num_classes))

Результат, разумеется, не поменялся.

Информация, которая может вам пригодится:

num_classes = 10

на последнем слое мы 512 классов приводим к 10


Ответы (1 шт):

Автор решения: Vlad Chapl

А обучение на своих данных точно проводили? Вкратце расскажу как можно сделать:

  1. от стандартного resnet18 откусываем голову и получаем кодер фич (в интернете ищем что-то вроде timm Feature Extraction);
  2. после тензора полученных фич ставим пару полносвязных слоев - получаем свою нейросеть;
  3. обучаем полученную нейросеть на своем наборе картинок (на входе фичи, на выходе класс).
→ Ссылка