Сумма производных второго порядка в тензорном потоке - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть функция в Tensorflow, давайте вызовем f, которая принимает в качестве входных данных тензор x в форме [None, N, M] и выводит число для каждой строки, т.е. на выходе получается тензор с формой [None] для произвольного числа строк.

Я хочу вычислить лапласиан из f, что в моем случае означает, что я хочу вычислить тензор y формы [None] со строками, заданными

\sqrt{foo}

Я могу получить градиент первого порядка так, как хочу. Ради этого примера, скажем, мой код выглядит так:

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], тогда я могу изменить код остальной части кода для работы с этим.

1 Ответ

0 голосов
/ 09 сентября 2018

Это забавно, потому что следующее прекрасно работает для меня.

Введите код:

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.]]])]
...