BatchNorm

Описание

Info

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

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

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

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

def __init__(self, size, 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 - Количество входных признаков, т.е. ось insize тензора вида (batchsize, insize);


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


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


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

Примеры

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

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

Info

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

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

>>> batchsize, insize = 3, 6
>>> data = gpuarray.to_gpu(np.arange(batchsize * insize).reshape(batchsize, insize).astype(np.float32))
>>> print(data)
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]
 [12. 13. 14. 15. 16. 17.]]

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

>>> bn = BatchNorm(insize)
>>> bn(data)

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

>>> print(bn.mean)
[[[[ 6.]]
  [[ 7.]]
  [[ 8.]]
  [[ 9.]]
  [[10.]]
  [[11.]]]]
>>> print(bn.var)
[[[[36.]]
  [[36.]]
  [[36.]]
  [[36.]]
  [[36.]]
  [[36.]]]]

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

>>> print(bn.scale)
[[[[1.0097325]]
  [[0.9922849]]
  [[0.9869034]]
  [[1.0015255]]
  [[1.0024816]]
  [[0.9988528]]]]
>>> print(bn.bias)
[[[[0.]]
  [[0.]]
  [[0.]]
  [[0.]]
  [[0.]]
  [[0.]]]]
Окончательный вид данных, прошедших через модуль:
>>> print(bn.data)
[[-1.1968222 -1.2156036 -1.2205907 -1.2226099 -1.2302258 -1.2214108]
 [ 0.         0.         0.         0.         0.         0.       ]
 [ 1.1968222  1.2156036  1.2205907  1.2226099  1.2302258  1.2214108]]