BatchNorm¶
Описание¶
Данный модуль реализует операцию батч-нормализации для двумерных тензоров типа (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]]