Каким образом стоит поменять последний слой 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
→ Ссылка
А обучение на своих данных точно проводили? Вкратце расскажу как можно сделать:
- от стандартного resnet18 откусываем голову и получаем кодер фич (в интернете ищем что-то вроде timm Feature Extraction);
- после тензора полученных фич ставим пару полносвязных слоев - получаем свою нейросеть;
- обучаем полученную нейросеть на своем наборе картинок (на входе фичи, на выходе класс).