【问题标题】:Sum of second order derivatives in TensorflowTensorflow 中的二阶导数之和
【发布时间】:2018-09-09 12:48:04
【问题描述】:

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

我想计算fLaplacian,在我的情况下,这意味着我想计算一个张量y,形状为[None],行由下式给出

我可以按照我想要的方式获得一阶渐变。为了这个例子,假设我的代码是这样的:

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 w.r.t. x 之和的导数”有关。总和,所以我想我可能需要在grad 的子切片上运行tf.gradients 多次。但是为什么我用上面的代码得到完整的一阶梯度呢?据我所知,没有求和,因为我得到了我想要的所有导数。

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

【问题讨论】:

    标签: python tensorflow derivative


    【解决方案1】:

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

    输入代码:

    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.]]])]
    

    【讨论】:

      猜你喜欢
      • 2021-04-17
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多