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