Keras 在深度学习模型中,如何获得输出相对于输入的偏导数?

Keras 在深度学习模型中,如何获得输出相对于输入的偏导数?,keras,deep-learning,automatic-differentiation,Keras,Deep Learning,Automatic Differentiation,我想在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

我想在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的所有二阶导数。有什么方便的方法得到这个吗



它类似于post,但此post将二维变量分离为两个一维变量。有没有其他方法可以在不分离输入的情况下获得梯度?

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


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

如果f如果变量为x=(x1,x2)的目标函数

那么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]

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

如果我不理解您试图实现的目标,很抱歉,但通常您希望计算损失相对于某个对象的梯度,而不是输出的梯度?!无论如何,我认为你的问题是重复的post@pafi是的,很相似。但是您的引用使用函数API分隔了两个输入,而我试图区分向量元素。是的,核心概念是相同的。但我认为这些答案也会对你有所帮助;你想计算神经网络关于输入的拉普拉斯函数吗?或者你希望损失函数与拉普拉斯函数有关吗。如果你只需要计算拉普拉斯函数;没有必要将其作为损失函数添加。一些澄清将有助于我们answer@Abhimanyu起初,它是一个拉普拉斯算子,所以可能tf.linalg.trace(tf.hessians)解决了这个问题,但现在我想获得每个偏导数。对不起,我把你弄糊涂了。我编辑了当我访问Hessian矩阵的每个元素的值时出现的问题。我想要tf.hessians(y_pred,x)的值,但这只提供了张量类型的东西。你能告诉我怎么访问这个吗?
tf.gradietns(tf.gradients(f,x)[0][:,0])[0][:,1]