[英]Sum of second order derivatives in Tensorflow
我在Tensorflow中有一个函数,让我们调用f
,它以[None, N, M]
形式的张量x
作为输入,并为每行输出一个数字,即输出是某些形式为[None]
的张量。任意数量的行。
我想计算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.]]]]]])]
它里面有正确的数字,但是它计算出的导数比我需要的要多得多,从混乱中挑选出数字似乎效率很低。
第二个问题 :我认为问题与tf.gradients(ys, xs)
返回“ tf.gradients(ys, xs)
中ys wrt x之和的导数”有关。 我不想要求和的导数,因此我想我可能需要在grad
tf.gradients
上运行tf.gradients
数次。 但是,为什么用上面的代码得到完整的一阶梯度呢? 据我所知,没有求和,因为我得到了所有想要的导数。
旁注 :如果x
的形状为[None, N*M]
会有所帮助,那么我可以重构其余代码以使用此格式。
这很有趣,因为以下内容非常适合我。
输入代码:
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.]]])]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.