我在Tensorflow中有一个函数,让我们在f
中调用它,它在表单[None, N, M]
上以张量x
作为输入,并为每一行输出一个数字,也就是说,输出是一个张量,对于任意数目的行,它的形式是[None]
。
我想要计算拉普拉斯 of f
,在我的例子中,这意味着我想要计算形状[None]
的张量y
,它的行是
我可以用我想要的方式得到一阶梯度。为了这个例子,假设我的代码如下所示:
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.]]]]]])]
这里面有正确的数字,但这也计算了比我所需要的更多的导数,从这个混乱中找出数字似乎效率很低。
次要问题:我认为这个问题与返回“ysw.r.t.x在xs中的求和”的导数有关。我不需要求和的导数,所以我想我可能需要在tf.gradients
的子切片上运行几次grad
。但是,为什么上面的代码得到了完整的一阶梯度呢?据我所知,没有求和,因为我得到了我想要的所有导数。
Side注意到:如果x
是形状为[None, N*M]
的话,那么我可以重构其余的代码来处理这个问题。
发布于 2018-09-09 10:14:04
这是一种有趣的,因为以下工作对我完美。
输入代码:
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.]]])]
https://stackoverflow.com/questions/52244681
复制相似问题