BatchNorm3D¶
Описание¶
Данный модуль реализует операцию батч-нормализации для пятимерных тензоров типа (batchsize, maps, d, h, w)
, например, после 3-мерных сверточных слоёв. Для более подробной теоретической информации см. 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, d, h, w)
;
epsilon
- небольшое число, добавляющееся при нормализации признаков для предотвращения деления на ноль (см. теорию в BatchNormND);
affine
- флаг, отвечает за то, будут ли scale
и bias
параметры слоя батч-нормализации обучаемыми, либо они будут зафиксированы (1 и 0 соответственно), в следствие чего слой будет проводить только операцию нормализации по среднему и дисперсии;
inplace
- флаг, показывающий, нужно ли выделять дополнительные ресурсы памяти для результата. Если True, то выходной тензор будет записан в памяти на место входного, что может негативно отразиться на работе сети, если входной тензор должен принимать участие в расчётах на других ветках графа.
Примеры¶
Необходимые импорты.
import numpy as np
from PuzzleLib.Backend import gpuarray
from PuzzleLib.Modules import BatchNorm3D
Info
gpuarray
необходим для правильного размещения тензора на GPU
Для данного модуля выведение тензоров на экран не привнесёт наглядности, поэтому в этом примере будет дан только код. Визуализированные примеры см. в BatchNorm или BatchNorm1D
Создадим синтетический тензор данных:
batchsize, maps, d, h, w = 5, 3, 10, 10, 10
data = gpuarray.to_gpu(np.arange(batchsize * maps * d * h * w).reshape(batchsize, maps, d, h, w).astype(np.float32))
Инициализируем объект класса с параметрами по умолчанию и применяем к данным:
bn = BatchNorm3D(maps)
bn(data)
Можно посмотреть значения среднего и дисперсии, которые были вычислены:
print(bn.mean)
print(bn.var)
А также инициализированные масштабы и сдвиги по умолчанию (масштабы - случайно нормально распределённые, сдвиги - нулевые):
print(bn.scale)
print(bn.bias)