Будет ли BatchNorm обучаться в Tensorflow, если слои будут заморожены, но is_training - True? - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь выполнить какое-то трансферное обучение, при котором мне нужно заморозить первые несколько слоев моей отдельной модели и настроить только последние несколько слоев с другим набором данных.

Я знаю, что , если мы ничего не замораживаем, мы просто устанавливаем для is_training значение True во время обучения и для is_training значение false во время тестирования. Но теперь мне было интересно, на что будет похоже поведение Batch-norm, если я исключу замороженные слои из обучаемых переменных с is_training, чтобы быть True.

Для того, чтобы заморозить слой "A", "B" и " C ", я сделал что-то вроде этого:

tvars = tf.contrib.framework.filter_variables(tf.trainable_variables(), exclude_patterns = ['A', 'B', 'C'])
grad = optimizer.comput_gradient(some_loss, tvars)

Но я не уверен, как мне установить« is_training »во время тренировки ... Насколько я понимаю, есть 2 обучаемые переменные" гамма "и "бета" для BatchNorm. Если я действительно надеюсь заморозить «A», «B», «C», мне нужно отключить операции обновления для них. Тем не менее, среднее значение и дисперсию по-прежнему необходимо обновлять во время трансферного обучения, верно? Tensorflow

1 Ответ

0 голосов
/ 01 апреля 2020

Нормализация партии добавляет два обучаемых параметра к каждому слою, поэтому нормализованный вывод умножается на параметр «стандартное отклонение» (гамма) и добавляется «средний» параметр (бета)

При установке training = False это означает, что слой нормализации партии будет использовать свое внутреннее сохраненное среднее значение среднего значения и дисперсию для нормализации пакета (как в режиме вывода), а не собственное среднее значение и дисперсию пакета. Когда training = False, эти внутренние переменные также не обновляются. Поскольку они инициализируются как среднее значение = 0, а дисперсия = 1, это означает, что нормализация партии эффективно отключена - слой вычитает ноль и делит результат на 1.

Если вы включите нормализацию партии с training = True, то начнет нормализовать партии внутри себя и собрать скользящее среднее значение и дисперсию каждой партии.

...