как определить производную от пользовательской функции активации в keras

У меня есть настраиваемая функция активации и ее производная, хотя я могу использовать настраиваемую функцию активации, я не знаю, как сказать keras, что является ее производной.

Похоже, он сам его находит, но у меня есть параметр, который должен использоваться функцией и ее производной, так как я могу это сделать?

Я знаю, что есть относительно простой способ сделать это в тензорном потоке, но я понятия не имею, как реализовать его в keras вот как это сделать в тензорном потоке

Изменить: основываясь на полученном мной ответе, возможно, я был недостаточно ясен. Я хочу реализовать собственную производную для моей функции активации, чтобы она использовала мою производную во время обратного распространения. Я знаю, как реализовать кастомную функцию активации.


person Tissuebox    schedule 08.08.2018    source источник
comment
Керас использует тензорный поток, поэтому определите его как тензорный поток op.   -  person Daniel Möller    schedule 08.08.2018
comment
как я уже сказал, я понятия не имею, как это реализовать в керасе   -  person Tissuebox    schedule 08.08.2018
comment
Реализуйте это в тензорном потоке. Керас будет использовать вашу функцию тензорного потока. В слое используйте activation=yourTensorflowFunc. Или используйте слой активации Activation(yourTensorflowFunc).   -  person Daniel Möller    schedule 08.08.2018
comment
это не мой вопрос, я знаю, как реализовать свою собственную функцию активации, я хочу реализовать ее производную, используемую во время обратного распространения   -  person Tissuebox    schedule 09.08.2018
comment
Вот что я пытаюсь сказать: реализуйте свою настраиваемую активацию и настраиваемую производную в тензорном потоке, следуя инструкциям, которые у вас есть. Керас действительно использует функцию тензорного потока.   -  person Daniel Möller    schedule 09.08.2018


Ответы (1)


Взгляните на исходный код, в котором определены функции активации Keras:

keras/activations.py

Например:

def relu(x, alpha=0., max_value=None):
    """Rectified Linear Unit.

    # Arguments
        x: Input tensor.
        alpha: Slope of the negative part. Defaults to zero.
        max_value: Maximum value for the output.

    # Returns
        The (leaky) rectified linear unit activation: `x` if `x > 0`,
        `alpha * x` if `x < 0`. If `max_value` is defined, the result
        is truncated to this value.
    """
    return K.relu(x, alpha=alpha, max_value=max_value)

А также как слои Keras вызывают функции активации: self.activation = activations.get(activation) activation может быть строковым или вызываемым.

Таким образом, аналогично вы можете определить свою собственную функцию активации, например:

def my_activ(x, p1, p2):
    ...
    return ...

Предположим, вы хотите использовать эту активацию в слое Dense, вы просто поместите свою функцию следующим образом:

x = Dense(128, activation=my_activ(p1, p2))(input)

Если вы имеете в виду, что хотите реализовать свою собственную производную:

Если ваша функция активации написана на функциях Tensorflow / Keras, операции которых дифференцируются (например, K.dot(), tf.matmul(), tf.concat() etc.), то производные будут получены путем автоматического дифференцирования https://en.wikipedia.org/wiki/Automatic_differentiation. В этом случае вам не нужно писать собственную производную.

Если вы все еще хотите переписать производные, проверьте этот документ https://www.tensorflow.org/extend/adding_an_op, где вам нужно зарегистрировать градиенты с помощью tf.RegisterGradient

person Nathan Explosion    schedule 09.08.2018
comment
Я знаю, как реализовать свою собственную функцию активации, я хочу реализовать ее настраиваемую производную, которая используется во время обратного распространения. - person Tissuebox; 09.08.2018