0

我想在 keras 中创建自己的损失函数,其中包含导数。例如,

def my_loss(x):
    def y_loss(y_true,y_pred):
        res = K.gradients(y_pred,x)
        return res
    return y_loss

被定义,并且

model = Sequential()
model.add(Dense(10, input_dim=2, activation='sigmoid'))
model.add(Dense(1, activation='linear'))
model_loss = my_loss(x=model.input)
model.compile(loss=model_loss, optimizer='adam')

现在因为输入是二维的,

K.gradients(y_pred,x)

必须是二维向量。但是,我不知道如何获得渐变中的每个标量。我最终想要的是 y_pred 关于 x 的所有二阶导数。有没有方便的方法来获得这个?


它与这篇文章类似,但这篇文章将二维变量分成了两个一维变量。有没有其他方法可以在不分离输入的情况下获得梯度?

4

2 回答 2

1

如果您想要 Laplacians ,为什么不使用具有所有二阶导数的 tf.hessians 呢?拉普拉斯算子应该等于 Hessian 矩阵的迹(按恒等式)

https://www.tensorflow.org/api_docs/python/tf/hessians

于 2019-03-14T07:52:30.057 回答
0

不幸的是,Keras 没有一种方便的方法来获取渐变的每个分量。因此,我使用 tensorflow 来解决这个问题。

if f 如果具有变量 x=(x1,x2) 的对象函数

X=tf.placeholder(tf.float32,shape=(None,2))
f=f(X)#assume it is defined'

那么 df/dx_1 是

tf.gradients(f,x)[0][:,0]

df/dx_2 是

tf.gradients(f,x)[0][:,1]

d^2f/dx_1^2 是

tf.gradietns(tf.gradients(f,x))[0][:,0]

d^2f/dx_2^2 是

tf.gradietns(tf.gradients(f,x))[0][:,1]

d^2f/dx_1dx_2 是

tf.gradietns(tf.gradients(f,x)[0][:,0])[0][:,1]

我相信有更好的方法,但我找不到。

于 2019-03-23T11:13:12.180 回答