如何在Keras中定义自定义激活函数的导数

我有一个自定义的激活函数及其导数,虽然我可以使用这个自定义激活函数,但我不知道如何告诉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注册你的梯度

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注