Tensorflow中的二阶导数和

时间:2018-09-09 12:48:05

标签: python tensorflow derivative

我在Tensorflow中有一个函数,让我们在f中进行调用,该函数以形式x的张量[None, N, M]作为输入,并为每行输出一个数字,即输出为任意数量的行的形式为[None]的张量。

我想计算f的{​​{3}},在我的情况下,这意味着我想计算形状为y的张量[None],其中行由< / p>

\sqrt{foo}

我可以按照自己的方式获得一阶梯度。为了这个例子,说我的代码是这样的:

import tensorflow as tf
x = tf.Variable([[[0.5, 1, 2], [3, 4, 5]]] , dtype=tf.float64)
y = tf.reduce_sum(x*x*x/3, axis=[1, 2])
grad = tf.gradients(y, x)[0]

所预期的结果

grad: [[[ 0.25  1.    4.  ]
        [ 9.   16.   25.  ]]]

我认为我现在可以在grad上进行同样的操作以获得第二个订单:

lap = tf.gradients(grad, x)

但这给了

lap: [-117.125]

这与我所期望的完全不同。我会想要的

lap: [[[ 1  2  4]
       [ 6  8 10]]]

或只是每一行的总和,就像这样:

lap: [ 31 ]

很显然,这并不能满足我的要求,而我对如何解决它有些困惑。有帮助吗?

我也尝试过tf.hessians,这种方法行之有效:

hess = tf.hessians(y, x)

给出

hess:
 [array([[[[[[ 1.,  0.,  0.],
             [ 0.,  0.,  0.]]],
           [[[ 0.,  2.,  0.],
             [ 0.,  0.,  0.]]],
           [[[ 0.,  0.,  4.],
             [ 0.,  0.,  0.]]]],

           [[[[ 0.,  0.,  0.],
              [ 6.,  0.,  0.]]],
            [[[ 0.,  0.,  0.],
              [ 0.,  8.,  0.]]],
            [[[ 0.,  0.,  0.],
              [ 0.,  0., 10.]]]]]])]

里面有正确的数字,但是它计算出的导数比我需要的要多得多,从混乱中挑选数字似乎效率很低。

次要问题:我认为此问题与tf.gradients(ys, xs)返回“ xs中ys wrt x的和的导数”有关。我没有我想要求和的导数,所以我想我可能需要在tf.gradients的子切片上运行grad几次。但是,为什么用上面的代码得到完整的一阶梯度呢?据我所知,没有求和,因为我得到了所有想要的导数。

旁注:如果x的形状为[None, N*M],如果有帮助,那么我可以重构其余的代码来使用它。

1 个答案:

答案 0 :(得分:0)

这很有趣,因为以下内容非常适合我。

输入代码:

import tensorflow as tf
x = tf.Variable([[[0.5, 1, 2], [3, 4, 5]]] , dtype=tf.float64)
y = tf.reduce_sum(x*x*x/3, axis=[1, 2])
grad = tf.gradients(y, x)[0]
grad2 = tf.gradients(grad, x)
init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init_op)
    g1, g2 = sess.run([grad, grad2])

print('First order : {}'.format(g1))
print('Second order : {}'.format(g2))

输出:

First order : [[[ 0.25  1.    4.  ]
  [ 9.   16.   25.  ]]]
Second order : [array([[[ 1.,  2.,  4.],
        [ 6.,  8., 10.]]])]