У меня есть функция в Tensorflow, давайте вызовем f
, которая принимает в качестве входных данных тензор x
в форме [None, N, M]
и выводит число для каждой строки, т.е. на выходе получается тензор с формой [None]
для произвольного числа строк.
Я хочу вычислить лапласиан из f
, что в моем случае означает, что я хочу вычислить тензор y
формы [None]
со строками, заданными
![\sqrt{foo}](https://chart.googleapis.com/chart?cht=tx&chl=y_k%20%3D%20%5Cnabla%5E2f%28x_k%29%20%3D%20%5Csum_%7Bi%3D1%7D%5EN%5Csum_%7Bj%3D1%7D%5E%7BM%7D%5Cfrac%7B%5Cpartial%5E2%20f%28x%29_k%7D%7B%5Cpartial%20x_%7Bkij%7D%5E2%7D)
Я могу получить градиент первого порядка так, как хочу. Ради этого примера, скажем, мой код выглядит так:
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)
возвратом "производных суммы ys от x в xs.". Я не хочу производных сумм , так что я думаю, что мне может понадобиться запустить tf.gradients
несколько раз для субликатов grad
. Но почему я получаю полный градиент первого порядка с кодом выше? Насколько я могу судить, не было суммирования, поскольку я получаю все производные, которые хочу.
Дополнительное примечание : Если это поможет, если x
имеет форму [None, N*M]
, тогда я могу изменить код остальной части кода для работы с этим.