我在Tensorflow中有一个函数,让我们在f
中进行调用,该函数以形式x
的张量[None, N, M]
作为输入,并为每行输出一个数字,即输出为任意数量的行的形式为[None]
的张量。
我想计算f
的{{3}},在我的情况下,这意味着我想计算形状为y
的张量[None]
,其中行由< / p>
我可以按照自己的方式获得一阶梯度。为了这个例子,说我的代码是这样的:
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]
,如果有帮助,那么我可以重构其余的代码来使用它。
答案 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.]]])]