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.
Нормализация по батчам отличается от других слоёв по нескольким ключевым аспектам:
1) Добавление BatchNormalization с training=True в модель приводит к тому, что результат одного примера зависит от содержимого всех других примеров в мини-пачке. Будьте внимательны при добавлении пачек или маскировании примеров, так как это может изменить статистику мини-пачки и повлиять на другие примеры.
2) Обновления весов (подвижные статистики) основаны на прямом проходе модели, а не на результате вычисления градиентов.
3) При выполнении вывода с помощью модели, содержащей нормализацию по батчам, обычно (хотя и не всегда) желательно использовать накопленные статистические данные, а не статистические данные мини-пачки. Это достигается путём передачи training=False при вызове модели или использования model.predict.
| Аргументы | |
|---|---|
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()не будет вызван снова.
Уравнения нормализации: Рассмотрим промежуточные активации (x) мини-пачки размером \(m\): Мы можем вычислить среднее и дисперсию пачки \({\mu_B} = \frac{1}{m} \sum_{i=1}^{m} {x_i}\) \({\sigma_B^2} = \frac{1}{m} \sum_{i=1}^{m} ({x_i} - {\mu_B})^2\) и затем вычислить нормализованное \(x\), включая небольшой множитель \({\epsilon}\) для числовой устойчивости. \(\hat{x_i} = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon} }\) И, наконец, \(\hat{x}\) линейно преобразуется с помощью \({\gamma}\) и \({\beta}\), которые являются обучаемыми параметрами: \({y_i} = {\gamma * \hat{x_i} + \beta}\) Ссылка:
© 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.3/api_docs/python/tf/keras/layers/BatchNormalization