Как выполнить тонкую настройку на сети Pytorch - PullRequest
0 голосов
/ 15 мая 2018

Я использую эту реализацию SegNet в Pytorch, и я хочу ее настроить. Я читал онлайн, и я нашел этот метод (в основном замораживание всех слоев, кроме последнего в вашей сети). Моя проблема в том, что в SegNet более 100 слоев, и я ищу более простой способ сделать это, а не писать 100 строк кода.

Как вы думаете, это может сработать? Или это полная чушь?

import torch.optim as optim

model = SegNet()
for name, param in model.named_modules():
    if name != 'conv11d':    # the last layer should remain active
        param.requires_grad = False

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)


def train():
    ...

Как я могу проверить, работает ли это как задумано?

1 Ответ

0 голосов
/ 16 мая 2018

Этот процесс называется тонкой настройкой, и установка requires_grad на False является хорошим способом сделать это. Из документов pytorch :

Каждый Тензор имеет флаг: requires_grad, который позволяет детально исключить подграфы из вычисления градиента и может повысить эффективность.

...

Если в операции, требующей градиента, имеется один вход, для ее вывода также потребуется градиент. И наоборот, только если все входные данные не требуют градиента, выходные данные также не требуют его. Вычисления в обратном направлении никогда не выполняются в подграфах, где всем тензорам не требуются градиенты.

См. этот урок по pytorch для соответствующего примера.

Один из простых способов убедиться, что это работает, - посмотреть на начальную частоту ошибок. Предполагая, что задача аналогична задаче, на которой сеть изначально была обучена, они должны быть намного ниже, чем для случайно инициализированной сети.

...