BatchNorm2D¶
Описание¶
Данный модуль реализует операцию батч-нормализации для четырехмерных тензоров типа (batchsize, maps, h, w)
, например, после 2-мерных сверточных слоёв. Для более подробной теоретической информации см. BatchNormND.
Инициализация¶
def __init__(self, numOfMaps, epsilon=1e-5, initFactor=1.0, minFactor=0.1, sscale=0.01, affine=True, name=None, empty=False, inplace=False):
Параметры
Параметр | Возможные типы | Описание | По умолчанию |
---|---|---|---|
size | int | Количество входных признаков. | - |
epsilon | float | Стабилизирующая константа. | 1e-5 |
initFactor | float | Начальное значение коэффициента сохранения в скользящем среднем. | 1.0 |
minFactor | float | Минимальное значение коэффициента сохранения в скользящем среднем. | 0.1 |
sscale | float | Дисперсия гауссовского распределения для масштабов scale batch нормализации. |
0.01 |
affine | bool | Если True, слой будет иметь обучаемые аффинные параметры scale и bias . |
True |
name | str | Имя слоя. | None |
empty | bool | Если True, то тензоры параметров модуля не инициализируются. | False |
inplace | bool | Если True, то выходной тензор будет записан в памяти на место входного. | False |
Note
Для того, чтобы понять, как используются initFactor
и minFactor
, следует упомянуть, что для расчёта статистических параметров в модуле используется принцип скользящего среднего, т.е.:
\begin{equation}
\hat{\mu} = \alpha\hat{\mu} + (1 - \alpha)\mu
\end{equation}
\begin{equation}
\hat{\sigma}^2 = \alpha\hat{\sigma}^2 + (1 - \alpha)\sigma^2
\end{equation}
где
\hat{\mu}, \mu - скользящее среднее и среднее на батче соответственно;
\hat{\sigma^2}, \sigma^2 - скользящая дисперсия и дисперсия на батче соответственно;
\alpha - коэффициент сохранения.
\alpha в модуле рассчитывается следующим образом: $$ \alpha = max(\frac{IF}{n}, MF) $$
где
IF - initFactor
, MF - minFactor
, n - номер батча.
size
- количество входных признаков, т.е. ось maps
тензора вида (batchsize, maps, h, w)
;
epsilon
- небольшое число, добавляющееся при нормализации признаков для предотвращения деления на ноль (см. теорию в BatchNormND);
affine
- флаг, отвечает за то, будут ли scale
и bias
параметры слоя батч-нормализации обучаемыми, либо они будут зафиксированы (1 и 0 соответственно), в следствие чего слой будет проводить только операцию нормализации по среднему и дисперсии;
inplace
- флаг, показывающий, нужно ли выделять дополнительные ресурсы памяти для результата. Если True, то выходной тензор будет записан в памяти на место входного, что может негативно отразиться на работе сети, если входной тензор должен принимать участие в расчётах на других ветках графа.
Примеры¶
Необходимые импорты.
>>> import numpy as np
>>> from PuzzleLib.Backend import gpuarray
>>> from PuzzleLib.Modules import BatchNorm2D
Info
gpuarray
необходим для правильного размещения тензора на GPU
Для данного модуля выведение тензоров на экран не привнесёт наглядности, поэтому в этом примере будет дан только код. Визуализированные примеры см. в BatchNorm или BatchNorm1D
Создадим синтетический тензор данных:
>>> batchsize, maps, h, w = 5, 3, 10, 10
>>> data = gpuarray.to_gpu(np.arange(batchsize * maps * h * w).reshape(batchsize, maps, h, w).astype(np.float32))
Инициализируем объект класса с параметрами по умолчанию и применяем к данным:
>>> bn = BatchNorm2D(maps)
>>> bn(data)
Можно посмотреть значения среднего и дисперсии, которые были вычислены:
>>> bn.mean
>>> bn.var
А также инициализированные масштабы и сдвиги по умолчанию (масштабы - случайно нормально распределённые, сдвиги нулевые):
>>> bn.scale
>>> bn.bias