Настройка партии нормализации поезд и время тестирования - PullRequest
1 голос
/ 16 марта 2019

В последнее время я прочитал так много статей, в которых много говорилось о нормализации партии кераса.

По данным этого сайта: Установите «training = False» для «tf.layers.batch_normalization», когдаобучение получит лучший результат проверки

В ответе говорится, что:

Если вы включите нормализацию партии с помощью обучения = True, это начнет нормализовать партии внутри себя исобрать скользящее среднее значение и дисперсию каждой партии.Теперь вот сложная часть.Скользящая средняя - это экспоненциальная скользящая средняя с импульсом по умолчанию 0,99 для tf.layers.batch_normalization ().Среднее значение начинается с 0, дисперсия снова с 1.Но поскольку каждое обновление применяется с весом (1 - импульс), оно асимптотически достигает фактического среднего значения и дисперсии в бесконечности.Например, за 100 шагов он достигнет около 73,4% от реального значения, потому что 0,99100 - это 0,366.Если у вас большие числовые значения, разница может быть огромной.

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

Итак, я должен установить training=False в call, что опять-таки из приведенной выше ссылки говорит, что:

Когда вы устанавливаете training = False, это означает, чтослой нормализации партии будет использовать свое внутреннее сохраненное среднее значение среднего и дисперсии для нормализации партии, а не собственное среднее значение и дисперсию партии.

И я знаю, что во время теста мы должны использовать скользящее среднее иотклонение от времени обучения. И я знаю, что может быть установлен moving_mean_initializer.

keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)

Я не уверен, правильно ли мое мнение:

(1) установить обучение = Falseпри тестировании и training=True при тренировке

(2) Используйте hsitory_weight = ModelCheckpoint(filepath="weights.{epoch:02d}.hdf5",save_weights_only=True,save_best_only=False) для сохранения веса нормализации (включая скользящее среднее и дисперсию курса gomma и beta)

(3) инициализируйте его тем, что мы получаем из шага (2)

Не уверен, что все, что я упомянул выше, неверно, если это так, пожалуйста, исправьте меня.

И я не уверен, как люди обычно справляются с этой проблемой? Работает ли тот, который я предлагаю?

Заранее спасибо!

1 Ответ

0 голосов
/ 21 марта 2019

Я делаю тест, После тренировки,

Я установил скользящее среднее и все дисперсии пакетных слоев на ноль.

И это дает плохой результат.

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

И флаг обучения детали, независимо от того, установлен ли он на True или False, единственное различие между ними -

будут ли обновляться скользящая дисперсия и скользящее среднее или нет.

...