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]]