Как исправить параметр слоя в обучающей сети в chainer v2.0?

Предположим, я предварительно обучил сеть на другой базе данных. Из-за проблемы переоснащения моя база данных не очень разнообразна, поэтому проблема переобучения очень серьезна. Я хочу загрузить предварительно обученный сетевой параметр в chainer v2.0, но исправить первые несколько слоев, в этом случае, что мне использовать в chainer v2.0, я знаю, что в chainer1.0 есть ключевое слово volatile, но оно устарело в v2 .0.

Должен ли я использовать chainer.no_backprop_mode(): внутри def __call__ при обработке первых нескольких слоев?


person machen    schedule 23.10.2017    source источник


Ответы (1)


Да, вы можете использовать диспетчер контекста chainer.no_backprop_mode() в своем коде прямого вычисления, чтобы исправить параметры определенных слоев. Вот пример:

def __call__(self, x):
    with chainer.no_backprop_mode():
        h1 = F.relu(self.l1(x))
    h2 = F.relu(self.l2(h1))
    return self.l3(h2)
person kmaehashi    schedule 31.10.2017
comment
Я спросил представителя компании chainer, он сказал: Если вы используете Chainer v2 или более позднюю версию, вы можете установить param.update_rule.enabled = False, при котором оптимизатор не будет обновлять параметр. ? какое лучшее решение? - person machen; 05.11.2017
comment
no_backprop_mode заставляет backprop пропустить вычисление градиента для слоев, но это не так. - person Seiya Tokui; 05.11.2017
comment
(Комментарий выше является ошибкой; пожалуйста, игнорируйте) Обратите внимание, что ни один режим обратного распространения просто не пропускает вычисление градиента, что приводит к нулевым градиентам для l1. Если вы используете, например, MomentumSGD, который использовался для оптимизации l1 (для предобучения) и вы не чистили состояние оптимизатора (в данном случае накопленные градиенты прошлых итераций), этот оптимизатор изменит параметр, даже если градиент равен нулю. Если вы используете свежий новый оптимизатор для тонкой настройки (или используете SGD, который не имеет состояния), параметр будет сохранен без изменений в режиме без обратного распространения. - person Seiya Tokui; 05.11.2017
comment
Вы имеете в виду, что в контексте chainer.no_backprop_mode() все еще есть возможность обновить параметр? например ИмпульсSGD??? Мой вопрос очень прост, как исправить какой-либо параметр слоя? Достаточно ли chainer.no_backprop_mode()? - person machen; 27.11.2017
comment
Вы имеете в виду, что мы должны использовать param.update_rule.enabled = False, чтобы исправить параметр некоторых слоев? Как это использовать? у вас есть пример кода? - person machen; 27.11.2017