PReLU

Описание

Info

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

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

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

\begin{equation}\label{eq:prelu} \text{PReLU}(x) = \begin{cases} x, & \text{ если } x \geq 0 \\ ax, & \text{ если } x < 0 \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
from PuzzleLib.Variable import Variable

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]

Тогда:

print(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.  ]]]]
Рекомендуется использовать значения slopes по умолчанию. Пример приведён с целью ознакомления с модулем.

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

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