tf.keras.layers.BatchNormalization
| Просмотреть исходный код на GitHub |
Слой, который нормализует свои входные данные.
tf.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,
**kwargs
)
Базовая нормализация применяет преобразование, которое поддерживает среднее значение вывода близким к 0, а стандартное отклонение вывода близким к 1.
Важно, что базовая нормализация работает по-разному во время обучения и во время вывода.
Во время обучения (т. е. при использовании fit() или при вызове слоя/модели с аргументом training=True), слой нормализует свой вывод, используя среднее и стандартное отклонение текущей порции входных данных. Это означает, что для каждого канала, который нормализуется, слой возвращает gamma * (batch - mean(batch)) / sqrt(var(batch) + epsilon) + beta, где:
-
epsilon— небольшая константа (настраиваемая как часть аргументов конструктора) -
gamma— обученная масштабирующая постоянная (инициализирована как 1), которую можно отключить, передавscale=Falseв конструктор. -
beta— обученная постоянная смещения (инициализирована как 0), которую можно отключить, передавcenter=Falseв конструктор.
Во время вывода (т. е. при использовании evaluate() или predict() или при вызове слоя/модели с аргументом training=False (который является значением по умолчанию), слой нормализует свой вывод, используя скользящее среднее значение среднего и стандартного отклонения порций, которые он видел во время обучения. То есть, он возвращает gamma * (batch - self.moving_mean) / sqrt(self.moving_var + epsilon) + beta.
self.moving_mean и self.moving_var — необучаемые переменные, которые обновляются каждый раз, когда слой вызывается в режиме обучения, таким образом:
moving_mean = moving_mean * momentum + mean(batch) * (1 - momentum)moving_var = moving_var * momentum + var(batch) * (1 - momentum)
Таким образом, слой будет нормализовывать свои входные данные только во время вывода после того, как был обучен на данных, которые имеют статистику, аналогичную данным вывода.
| Аргументы | |
|---|---|
axis | Целое число, ось, которая должна быть нормализована (обычно ось признаков). Например, после слоя Conv2D со значением data_format="channels_first", установите axis=1 в BatchNormalization. |
momentum | Импульс для скользящего среднего. |
epsilon | Небольшое число, которое добавляется к дисперсии, чтобы избежать деления на ноль. |
center | Если True, добавить смещение beta к нормализованному тензору. Если False, beta игнорируется. |
scale | Если True, умножить на gamma. Если False, gamma не используется. Когда следующий слой является линейным (например, nn.relu), это можно отключить, так как масштабирование будет выполнено следующим слоем. |
beta_initializer | Инициализатор для веса бета. |
gamma_initializer | Инициализатор для веса гамма. |
moving_mean_initializer | Инициализатор для скользящего среднего. |
moving_variance_initializer | Инициализатор для скользящей дисперсии. |
beta_regularizer | Необязательный регуляризатор для веса бета. |
gamma_regularizer | Необязательный регуляризатор для веса гамма. |
beta_constraint | Необязательное ограничение для веса бета. |
gamma_constraint | Необязательное ограничение для веса гамма. |
Аргументы вызова:
-
inputs: Входной тензор (любого ранга). -
training: Булево значение Python, указывающее, должен ли слой работать в режиме обучения или в режиме вывода.-
training=True: Слой нормализует свои входные данные, используя среднее и дисперсию текущей порции входных данных. -
training=False: Слой нормализует свои входные данные, используя среднее и дисперсию своих скользящих статистик, вычисленных во время обучения.
-
Форма входных данных:
Произвольная. Используйте ключевой аргумент input_shape (кортеж целых чисел, не включая ось образцов), когда этот слой используется в качестве первого слоя в модели.
Форма выходных данных:
Такая же форма, как у входных данных.
Ссылка:
О настройке layer.trainable = False на слое BatchNormalization:
Установка layer.trainable = False означает заморозку слоя, т. е. его внутреннее состояние не изменится во время обучения: его обученные веса не будут обновляться во время fit() или train_on_batch(), и его обновления состояния не будут выполняться.
Обычно это не обязательно означает, что слой работает в режиме вывода (что обычно контролируется аргументом training, который может быть передан при вызове слоя). "Замороженное состояние" и "режим вывода" — это два отдельных понятия.
Однако в случае слоя BatchNormalization установка trainable = False на слое означает, что слой впоследствии будет работать в режиме вывода (то есть он будет использовать скользящее среднее и скользящую дисперсию для нормализации текущей порции, а не среднее и дисперсию текущей порции).
Это поведение было введено в TensorFlow 2.0, чтобы обеспечить layer.trainable = False наиболее ожидаемое поведение в сценарии донастройки сверточной сети.
Примечание:
- Установка
trainableв модели, содержащей другие слои, рекурсивно установит значениеtrainableдля всех внутренних слоёв. - Если значение атрибута
trainableизменяется после вызоваcompile()на модели, новое значение не вступит в силу для этой модели, покаcompile()не будет вызвано снова.
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/keras/layers/BatchNormalization