Ich habe eine Verlust Wert/Funktion und ich möchte alle zweiten Derivate in Bezug auf einen Tensor f (der Größe n) berechnen. Ich habe es geschafft, tf.gradients zweimal zu verwenden, aber wenn ich es zum zweiten Mal anwende, summiert es die Ableitungen über die erste Eingabe (siehe second_derivatives in meinem Code).Wie berechnet man alle zweiten Ableitungen (nur die Diagonale der hessischen Matrix) in Tensorflow?
Auch ich schaffte es, die Hesse-Matrix zu erhalten, aber ich möchte nur seine Diagonale berechnen, um zusätzliche Berechnungen zu vermeiden.
import tensorflow as tf
import numpy as np
f = tf.Variable(np.array([[1., 2., 0]]).T)
loss = tf.reduce_prod(f ** 2 - 3 * f + 1)
first_derivatives = tf.gradients(loss, f)[0]
second_derivatives = tf.gradients(first_derivatives, f)[0]
hessian = [tf.gradients(first_derivatives[i,0], f)[0][:,0] for i in range(3)]
model = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(model)
print "\nloss\n", sess.run(loss)
print "\nloss'\n", sess.run(first_derivatives)
print "\nloss''\n", sess.run(second_derivatives)
hessian_value = np.array(map(list, sess.run(hessian)))
print "\nHessian\n", hessian_value
Mein Denken war, dass tf.gradients (first_derivatives, f [0, 0]) [0] zum Beispiel der zweite Ableitung in Bezug auf abrufen funktionieren würde F_0 aber es scheint, dass tensorflow nicht erlauben, von einer Scheibe eines Tensors abzuleiten.
Tanks für Ihre Antwort, leider ist es wirklich nicht helfen, weil ich würde mag nur die Diagonale des Hessischen abrufen. Ich habe versucht, pack mit x [0], x [1] zu verwenden ... aber es gibt mir immer noch einen Fehler. –
'hess0 = tf.gradienten ([Grad [0]], [x]); hess1 = tf.gradienten ([grads [1]], [y]) 'würde nur diagonale Einträge berechnen –
Danke, ich habe es endlich geschafft, es mit dem zu tun, was du zuletzt geantwortet hast und tf.pack()! –