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