Spec-Zone.ru › TensorFlow 2.9

tf.keras.layers.BatchNormalization

Просмотреть исходный код на GitHub

Слой, который нормализует свои входные данные.

Наследуется от: Layer, Module

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 (кортеж целых чисел, не включая ось образцов), когда этот слой используется в качестве первого слоя в модели.

Форма выходных данных:

Такая же форма, как у входных данных.

Ссылка:

  • Ioffe и Szegedy, 2015.

О настройке 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API