我有一个自定义的激活函数及其导数,虽然我可以使用这个自定义激活函数,但我不知道如何告诉Keras它的导数是什么。
看起来Keras似乎可以自己找到导数,但我的函数和其导数之间需要共享一个参数,我该如何实现这一点呢?
我知道在TensorFlow中有一个相对简单的实现方法,但我不知道如何在Keras中实现,这是如何在TensorFlow中实现的
编辑:基于我得到的回答,我可能没有解释清楚。我想要的是为我的激活函数实现一个自定义的导数,以便在反向传播过程中使用我的导数。我知道如何实现自定义激活函数。
回答:
请查看Keras定义激活函数的源代码:
keras/activations.py
例如:
def relu(x, alpha=0., max_value=None): """整流线性单元。 # 参数 x: 输入张量。 alpha: 负部斜率。默认为零。 max_value: 输出最大值。 # 返回 整流线性单元激活:如果 `x > 0`,则为 `x`, 如果 `x < 0`,则为 `alpha * x`。如果定义了 `max_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() 等
),那么导数将通过自动微分获得 https://en.wikipedia.org/wiki/Automatic_differentiation。在这种情况下,你不需要编写自己的导数。
如果你仍然想重新编写导数,请查看此文档 https://www.tensorflow.org/extend/adding_an_op,你需要使用tf.RegisterGradient
注册你的梯度