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

时间:2019-03-14 05:52:50

标签: 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(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的所有二阶导数。有一种方便的方法可以得到这个吗?


它类似于this帖子,但是该帖子将二维变量分成两个一维变量。还有其他方法可以在不分离输入的情况下获得梯度吗?

2 个答案:

答案 0 :(得分:1)

如果要使用Laplacians,为什么不使用所有第二阶导数的tf.hessians?拉普拉斯算子应等于Hessian矩阵的迹线(按身份)

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

答案 1 :(得分:0)

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

如果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]

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