Keras - использование функции активации с параметром
Как можно использовать протекающие ReLU в новейшей версии keras?
Функция relu() принимает необязательный параметр 'alpha', который отвечает за отрицательный наклон, но я не могу понять, как передать ths paramtere при построении слоя.
Эта строка, как я пытался это сделать,
model.add(Activation(relu(alpha=0.1))
но затем я получаю ошибку
TypeError: relu() missing 1 required positional argument: 'x'
Как я могу использовать утечку ReLU или любую другую функцию активации с некоторым параметром?
Ответы
Ответ 1
relu
- это функция, а не класс, и она вводит функцию активации в качестве параметра x
. Уровень активации принимает функцию в качестве аргумента, поэтому вы можете инициализировать ее с помощью лямбда-функции через вход x
, например:
model.add(Activation(lambda x: relu(x, alpha=0.1)))
Ответ 2
Ну, из этого источника (keras doc), и этот github question, вы используете линейную активацию, после чего вы помещаете текущее relu в качестве другого слоя сразу после.
from keras.layers.advanced_activations import LeakyReLU
model.add(Dense(512, 512, activation='linear')) # Add any layer, with the default of an identity/linear squashing function (no squashing)
model.add(LeakyReLU(alpha=.001)) # add an advanced activation
Помогает ли это?
Ответ 3
Вы можете создать оболочку для параметризованных функций активации. Я нашел это полезным и более интуитивным.
class activation_wrapper(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
def _func(x):
return self.func(x, *args, **kwargs)
return _func
Конечно, я мог бы использовать лямбда-выражение в вызове.
Тогда
wrapped_relu = activation_wrapper(relu).
Затем используйте его, как указано выше
model.add(Activation(wrapped_relu(alpha=0.1))
Вы также можете использовать его как часть слоя
model.add(Dense(64, activation=wrapped_relu(alpha=0.1))
Хотя это решение немного сложнее, чем предложенное @Thomas Jungblut, класс-оболочку можно повторно использовать для любой параметризованной функции активации. Фактически, я использовал это всякий раз, когда у меня есть семейство функций активации, которые параметризованы.