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,
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().
Ссылка:
© 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