PReLU¶
Описание¶
Этот модуль реализует параметрическую выпрямленную линейную функцию активации (parametric rectified linear unit, PReLU). Она определяется следующей формулой:
где 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]