BatchNorm1D

Описание

Info

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

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

Данный модуль реализует операцию батч-нормализации для трехмерных тензоров типа (batchsize, maps, insize), например, после одномерных сверточных слоёв. Для более подробной теоретической информации см. 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, insize);


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


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


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

Примеры

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

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

Info

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

Создадим синтетический тензор данных, удобный для демонстрации работы модуля:

>>> batchsize, maps, size = 3, 2, 2
>>> data = gpuarray.to_gpu(np.arange(batchsize * maps * size).reshape(batchsize, maps, size).astype(np.float32))
>>> data
[[[ 0.  1.]
  [ 2.  3.]]

 [[ 4.  5.]
  [ 6.  7.]]

 [[ 8.  9.]
  [10. 11.]]]

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

>>> bn = BatchNorm1D(maps)
>>> bn(data)

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

>>> bn.mean
[[[[4.5]]

  [[6.5]]]]

>>>  bn.var
[[[[13.100001]]

  [[13.100001]]]]

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

>>> bn.scale
[[[[1.006838 ]]

  [[1.0114421]]]]
>>> bn.bias
[[[[0.]]

  [[0.]]]]
Окончательный вид данных, прошедших через модуль:
>>> bn.data
[[[-1.3712823  -1.0665529 ]
  [-1.377553   -1.0714301 ]]

 [[-0.15236473  0.15236467]
  [-0.15306139  0.15306151]]

 [[ 1.0665529   1.3712823 ]
  [ 1.0714302   1.3775531 ]]]