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, класс-оболочку можно повторно использовать для любой параметризованной функции активации. Фактически, я использовал это всякий раз, когда у меня есть семейство функций активации, которые параметризованы.