Spec-Zone.ru › TensorFlow 2.4

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,
    renorm=False, renorm_clipping=None, renorm_momentum=0.99, fused=None,
    trainable=True, virtual_batch_size=None, adjustment=None, name=None, **kwargs
)

Нормализация по батчам применяет преобразование, которое поддерживает среднее значение выхода близким к 0, а стандартное отклонение выхода близким к 1.

Важно, что нормализация по батчам работает по-разному во время обучения и во время вывода.

Во время обучения (т.е. при использовании fit() или при вызове слоя/модели с аргументом training=True), слой нормализует свой вывод, используя среднее и стандартное отклонение текущей порции входных данных. То есть для каждого нормализуемого канала слой возвращает (batch - mean(batch)) / (var(batch) + epsilon) * gamma + beta, где:

  • epsilon — небольшая константа (настраиваемая в качестве аргумента конструктора)
  • gamma — изучаемый масштабирующий множитель (инициализированный как 1), который можно отключить, передав scale=False в конструктор.
  • beta — изучаемый смещающий множитель (инициализированный как 0), который можно отключить, передав center=False в конструктор.

Во время вывода (т.е. при использовании evaluate() или predict() или при вызове слоя/модели с аргументом training=False (который является значением по умолчанию), слой нормализует свой вывод, используя скользящее среднее значения среднего и стандартного отклонения порций, которые он видел во время обучения. То есть он возвращает (batch - self.moving_mean) / (self.moving_var + epsilon) * gamma + 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 Инициализатор для веса beta.
gamma_initializer Инициализатор для веса gamma.
moving_mean_initializer Инициализатор для скользящего среднего.
moving_variance_initializer Инициализатор для скользящей дисперсии.
beta_regularizer Необязательный регуляризатор для веса beta.
gamma_regularizer Необязательный регуляризатор для веса gamma.
beta_constraint Необязательное ограничение для веса beta.
gamma_constraint Необязательное ограничение для веса gamma.
renorm Использовать Batch Renormalization. Это добавляет дополнительные переменные во время обучения. Вывод одинаковый для любого значения этого параметра.
renorm_clipping Словарь, который может сопоставить ключи 'rmax', 'rmin', 'dmax' со скалярными Tensors, используемыми для обрезки корректировки renorm. Коррекция (r, d) используется как corrected_value = normalized_value * r + d, с r обрезана до [rmin, rmax], а d до [-dmax, dmax]. Отсутствующие rmax, rmin, dmax установлены соответственно в inf, 0, inf.
renorm_momentum Инерция, используемая для обновления скользящих средних и стандартных отклонений с renorm. В отличие от momentum, это влияет на обучение и не должно быть слишком маленьким (что добавит шума) или слишком большим (что даст устаревшие оценки). Обратите внимание, что momentum все равно используется для получения средних и дисперсий для вывода.
fused Если True, использовать более быструю, объединённую реализацию, или вызвать ValueError, если объединённая реализация не может быть использована. Если None, использовать более быструю реализацию, если возможно. Если False, не использовать объединённую реализацию.
trainable Булево значение, если True переменные будут помечены как тренируемые.
virtual_batch_size Функция. По умолчанию virtual_batch_size является None, что означает, что нормализация по батчам выполняется по всему батчу. Когда virtual_batch_size не None, вместо этого выполняется "Ghost Batch Normalization", которая создаёт виртуальные подбатчи, каждый из которых нормализуется отдельно (с общими gamma, beta и скользящей статистикой). Необходимо разделить фактический размер батча во время выполнения.
adjustment Функция, принимающая Tensor, содержащую (динамическую) форму тензора входных данных, и возвращающая пару (масштаб, смещение) для применения к нормализованным значениям (перед gamma и beta) только во время обучения. Например, если ось==-1, adjustment = lambda shape: ( tf.random.uniform(shape[-1:], 0.93, 1.07), tf.random.uniform(shape[-1:], -0.1, 0.1)) будет масштабировать нормализованное значение до 7% вверх или вниз, затем сдвигать результат до 0,1 (с независимым масштабированием и смещением для каждого признака, но общими для всех примеров), и, наконец, применять gamma и/или beta. Если None, корректировка не применяется. Не может быть указан, если задан virtual_batch_size.

Аргументы вызова:

  • 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 наиболее ожидаемое поведение в случае тонкой настройки сверточных сетей.

Примечание:

  • Это поведение существует только начиная с TensorFlow 2.0. В версии 1.*, настройка layer.trainable = False замораживала слой, но не переключала его в режим вывода.
  • Настройка trainable в модели, содержащей другие слои, рекурсивно устанавливает значение trainable всех внутренних слоёв.
  • Если значение атрибута trainable изменяется после вызова compile() в модели, новое значение не вступит в силу для этой модели до тех пор, пока не будет снова вызван compile().

Ссылка:

  • Ioffe and Szegedy, 2015.

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/keras/layers/BatchNormalization

Spec-Zone.ru

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