如何在keras中定义自定义激活函数的导数
how to define the derivative of a custom activation function in keras
我有一个自定义激活函数及其导数,虽然我可以使用自定义激活函数但我不知道如何告诉keras它的导数是什么。
它似乎自己找到了一个,但我有一个参数必须在函数及其导数之间共享,所以我该怎么做?
我知道在 tensorflow 中有一个相对 简单的方法,但我不知道如何在 keras 中实现它
编辑:根据我得到的答案,可能我不够清楚。我想要的是为我的激活函数实现一个自定义导数,以便它在反向传播期间使用我的导数。我知道如何实现自定义激活函数。
看看定义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
注册您的渐变
我有一个自定义激活函数及其导数,虽然我可以使用自定义激活函数但我不知道如何告诉keras它的导数是什么。
它似乎自己找到了一个,但我有一个参数必须在函数及其导数之间共享,所以我该怎么做?
我知道在 tensorflow 中有一个相对 简单的方法,但我不知道如何在 keras 中实现它
编辑:根据我得到的答案,可能我不够清楚。我想要的是为我的激活函数实现一个自定义导数,以便它在反向传播期间使用我的导数。我知道如何实现自定义激活函数。
看看定义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