【发布时间】:2018-09-09 12:48:04
【问题描述】:
我在 Tensorflow 中有一个函数,让我们调用 f,它以 [None, N, M] 形式的张量 x 作为输入,并为每一行输出一个数字,即输出是形式为 @987654326 的张量@ 表示任意数量的行。
我想计算f 的Laplacian,在我的情况下,这意味着我想计算一个张量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