PReLU

Описание

Info

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

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

Этот модуль реализует параметрическую выпрямленную линейную функцию активации (parametric rectified linear unit, PReLU). Она определяется следующей формулой:

\begin{equation}\label{eq:prelu} \text{PReLU}(x) = \begin{cases} x, & \text{ if } x \geq 0 \\ ax, & \text{ otherwise } \end{cases} \end{equation}

где a - обучаемый параметр.

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

def __init__(self, maps, inplace=False, sharedMaps=False, name=None):

Параметры

Параметр Возможные типы Описание По умолчанию
maps int Количество карт в тензоре. -
inplace bool Если True, то выходной тензор будет записан в памяти на место входного. False
sharedMaps bool Унифицированность коэффициента для всех карт. False
name str Имя слоя. None

Пояснения

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


sharedMaps - если этому параметру присвоено значение True, коэффициент a в функции prelu(x)=max(ax, 0) будет одинаковый для всех карт.

Примеры

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

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

Info

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

>>> batchsize, maps, h, w = 1, 3, 5, 5
>>> np.random.seed(1234)
>>> data = gpuarray.to_gpu(np.random.randint(-9, 9, (batchsize, maps, h, w)).astype(np.float32))
>>> print(data)
[[[[ 2. -7.  6. -6.  5.]
   [-7. -5. -8.  1. -7.]
   [ 4. -6.  3. -4.  8.]
   [ 7. -1.  4.  2.  6.]
   [ 7. -9.  8. -9.  8.]]

  [[ 0. -6. -5. -8.  2.]
   [ 8. -3. -7. -2.  3.]
   [ 3. -9. -1.  6.  4.]
   [ 4.  0.  6. -5. -2.]
   [-2.  8. -2. -4. -7.]]

  [[-3. -1.  8.  0.  6.]
   [ 2.  3. -6.  1.  2.]
   [-7. -1. -8.  5. -5.]
   [ 1. -6.  8.  6. -9.]
   [ 4.  7.  0. -6.  7.]]]]

Инициализируем модуль с параметрами по умолчанию. Атрибут slopes является тем самым обучаемым коэффициентом, начальное значение которого равно 0.25 для всех карт:

>>> preluMod = PRelu(maps)
>>> print(preluMod.slopes)
[0.25 0.25 0.25]

Для наглядной демонстрации работы модуля зададим свои коэффициенты:

>>> slopes = np.array([0.5, 0, 0.25], dtype=np.float32)
>>> preluMod.setVar("slopes", Variable(gpuarray.to_gpu(slopes)))
>>> print(preluMod.slopes)
[0.5  0.   0.25]

Тогда:

>>> preluMod(data)
[[[[ 2.   -3.5   6.   -3.    5.  ]
   [-3.5  -2.5  -4.    1.   -3.5 ]
   [ 4.   -3.    3.   -2.    8.  ]
   [ 7.   -0.5   4.    2.    6.  ]
   [ 7.   -4.5   8.   -4.5   8.  ]]

  [[ 0.   -0.   -0.   -0.    2.  ]
   [ 8.   -0.   -0.   -0.    3.  ]
   [ 3.   -0.   -0.    6.    4.  ]
   [ 4.    0.    6.   -0.   -0.  ]
   [-0.    8.   -0.   -0.   -0.  ]]

  [[-0.75 -0.25  8.    0.    6.  ]
   [ 2.    3.   -1.5   1.    2.  ]
   [-1.75 -0.25 -2.    5.   -1.25]
   [ 1.   -1.5   8.    6.   -2.25]
   [ 4.    7.    0.   -1.5   7.  ]]]]

При sharedMaps=True коэффициент будет одинаковым для всех карт:

>>> preluMod = PRelu(maps, sharedMaps=True)
>>> print(preluMod.slopes)
[0.25]