Всем привет! Подскажите, пожалуйста. Вопрос про использование предобученных сетей, заморозку слоев и про обучение только части сети.
В задаче нужно находить точки на изображении. Использую resnet50 предобученную на ImageNet. Заменяю выход последнего слоя с 1000 классов на количество точек*2 (х и у координата)
import torchvision.models as models
...
model = models.resnet50(pretrained=True, )
model.fc = nn.Linear(model.fc.in_features, 2 * NUM_PTS, bias=True)
Для начала хотел попробовать обучить только последний fc слой
# freeze all layers
for param in model.parameters():
param.requires_grad = False
# train only head
model.fc.weight.requires_grad = True
model.fc.bias.requires_grad = True
Я рассчитывал, что обучение у такой сети будет гораздо быстрей, чем когда все слои разморожены. Но на мое удивление скорость осталась практически той же самой на эпоху 20 мин vs 17 минут
Вопрос. Правильно ли я заморозил слои? Разве сеть не должна обучаться быстрей, чем если бы все слои были разморожены?
грубо говоря, резнет_50 (или другая обученная умными людьми с большими компьютерами модель) состоит из 2 частей: 1. конволюшнл 2. классификатор. конволюшнл часть этой модели уже натренирована определять разные фичерсы на картинке ( углы, линии, и.т.д) , а классификатор уже по этим фичерсам уже находит объекты. учитывая что, любой объект который можно нарисовать на картинке состоит из углов, линий и прочих фичерсов, и смысла тренировать конволюшнл часть нет ( темболее это вычислительно дорого) так как всеравно мы получим эти фичерсы снова, достачно просто сделать собсввенный классификатор и добавить его к выходу conv части предварительно натренированной модели. Что я так понимаю и нужно сделать в Вашем случае. я хз, что за точка , допустим нужно найти на картинках шар для боулинга, делайте собственный датасет из картинок шаров и тренируйте только "последний слой" как Вы его называете. ...... насчет постепенного обучение методом поочередного подключения слоев, мне кажется так работать не будет потому что это математический не правильно. Обудение у сетей ведется за счет вычесления (частная производная) вклада в ошибку каждого нейрона в сети, тоесть, если опять грубо, один нейрон это одна фукнция, то сеть это матрешка этих функций. таким образом ( на основании правила дифиренцировании сложной функции) предыдущий слой модели оказывает влияние на велечину производной (влияние на ошибку) следующих слоев. таким образом каждый раз когда Вы активируете новый слой вы просто говорите вот вам еще один слой начинайте (еще более сложный) бакпроб занова