BatchNorm3D

Описание

Info

Родительский класс: BatchNormND

Производные классы: -

Данный модуль реализует операцию батч-нормализации для пятимерных тензоров типа (batchsize, maps, d, h, w), например, после 3-мерных сверточных слоёв. Для более подробной теоретической информации см. BatchNormND.

Инициализация

def __init__(self, maps, 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, d, h, w);


epsilon - небольшое число, добавляющееся при нормализации признаков для предотвращения деления на ноль (см. теорию в BatchNormND);


affine - флаг, отвечает за то, будут ли scale и bias параметры слоя батч-нормализации обучаемыми, либо они будут зафиксированы (1 и 0 соответственно), в следствие чего слой будет проводить только операцию нормализации по среднему и дисперсии;


inplace - флаг, показывающий, нужно ли выделять дополнительные ресурсы памяти для результата. Если True, то выходной тензор будет записан в памяти на место входного, что может негативно отразиться на работе сети, если входной тензор должен принимать участие в расчётах на других ветках графа.

Примеры

Необходимые импорты.

>>> import numpy as np
>>> from PuzzleLib.Backend import gpuarray
>>> from PuzzleLib.Modules import BatchNorm3D

Info

gpuarray необходим для правильного размещения тензора на GPU

Для данного модуля выведение тензоров на экран не привнесёт наглядности, поэтому в этом примере будет дан только код. Визуализированные примеры см. в BatchNorm или BatchNorm1D

Создадим синтетический тензор данных:

>>> batchsize, maps, d, h, w = 5, 3, 10, 10, 10
>>> data = gpuarray.to_gpu(np.arange(batchsize * maps * d * h * w).reshape(batchsize, maps, d, h, w).astype(np.float32))

Инициализируем объект класса с параметрами по умолчанию и применяем к данным:

>>> bn = BatchNorm3D(maps)
>>> bn(data)

Можно посмотреть значения среднего и дисперсии, которые были вычислены:

>>> bn.mean
>>> bn.var

А также инициализированные масштабы и сдвиги по умолчанию (масштабы - случайно нормально распределённые, сдвиги нулевые):

>>> bn.scale
>>> bn.bias