2016-07-27 47 views
2

Ich habe eine Kette von Standard-TensorFlow-Operationen, und ich muss einen benutzerdefinierten Farbverlauf für diese Kette als Ganzes angeben.Benutzerdefinierte Steigung für eine Kette von Ops

Angenommen, im folgenden Beispiel sind diese Operationen in einer einzigen Python-Funktion gruppiert: 'my_op'. Was ich versuche ist, einen benutzerdefinierten Farbverlauf für 'my_op' anzugeben. Ich habe mir RegisterGradient, gradient_override_map und tf.Graph.create_op angesehen, aber ich konnte kein einfaches Beispiel finden, wie man mit ihnen einen benutzerdefinierten Farbverlauf für eine Gruppe von Ops definiert, ohne die gesamte Operationskette in C++ umzuschreiben.

import numpy as np 
import tensorflow as tf 

n = 2 
m = 3 
x = np.random.normal(size=(1, n)) 
A = tf.Variable(tf.truncated_normal(shape=(n, m), dtype=tf.float32)) 
b = tf.Variable(tf.zeros(shape=(1, m), dtype=tf.float32)) 

def my_op(a): 
    return tf.add(tf.matmul(a, A), b) 

x_placeholder = tf.placeholder(tf.float32,shape=[1, n]) 
t = my_op(tf.stop_gradient(x_placeholder)) 

grad = tf.gradients(t, [A]) 


sess = tf.Session() 
sess.run(tf.initialize_all_variables()) 

result = sess.run(grad, feed_dict={x_placeholder: x}) 

print(result) 

sess.close() 
+0

Vielleicht Beispiel in [testFunctionGradientsWithGradFunc] (https://github.com/tensorflow/tensorflow/blob/73ced9d797056c7e67a06ed2098dd809d85ec44a/tensorflow/python/ops/gradients_test.py#L351) ist hilfreich –

+0

Dank @Yaroslav, aber ich bin nicht sicher, dass ich es vollständig verstehe. Soll ich my_op mit Funktion.Defunc irgendwie dekorieren? Würdest du so freundlich sein, eine Antwort hinzuzufügen und das einfache Beispiel zu bearbeiten, das ich erstellt habe? – njk

Antwort

0

Soweit ich sehen kann, die beste Möglichkeit, eine benutzerdefinierte Farbverlauf definieren können (d. Eine Änderung der Ebene Gradienten geben) ist eine neue benutzerdefinierte ops in tensorflow folgenden this hinzuzufügen. Wie Sie sehen können, können Sie für einen benutzerdefinierten Befehl, der die Eingabe ausgibt, die Farbverläufe in Python definieren, indem Sie @ops.RegisterGradient("MyOp") verwenden.

+0

Danke 童学智. Ich habe dieses Tutorial gesehen, aber wie gesagt, ich möchte vermeiden, meinen Code in C++ zu schreiben, weil eine Kombination von Standard-TensorFlow-Operationen für das, was ich brauche, ausreicht. Ich muss nur einen benutzerdefinierten Farbverlauf für diese Operationskette definieren. – njk

+0

Wissen Sie, wie Sie eine benutzerdefinierte Operation definieren, ohne sie in C++ schreiben zu müssen? – njk

+0

Soweit die Dokumente sagen, nein. Aber es ist keine große Sache in C++, wenn Sie nur die Gradienten ändern. Sie können eine benutzerdefinierte Op basierend auf [identity_op] erstellen (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/identity_op.h). Beachten Sie auch, dass Ops und Kernel nicht identisch sind, Sie können 'REGISTER_OP' verwenden, um einen Op basierend auf einigen existierenden Kernel zu registrieren (aber das ist nur eine Idee, ich habe es nicht versucht). –