2016-07-27 4 views
2

У меня есть цепочка стандартных операций TensorFlow, и мне нужно указать собственный градиент для этой цепочки в целом.Пользовательский градиент для цепочки ops

Скажите, что в приведенном ниже примере эти операции сгруппированы в одну функцию Python: 'my_op'. То, что я пытаюсь сделать, это указать собственный градиент для «my_op». Я посмотрел на RegisterGradient, gradient_override_map и tf.Graph.create_op, но я не смог найти простой пример того, как использовать их для определения настраиваемого градиента для группы ops без перезаписи всей цепочки операций на C++.

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

Возможно пример в [testFunctionGradientsWithGradFunc] (https://github.com/tensorflow/tensorflow/blob/73ced9d797056c7e67a06ed2098dd809d85ec44a/tensorflow/python/ops/gradients_test.py#L351) полезно –

+0

Спасибо @Yaroslav, но я не конечно, что я полностью понимаю. Должен ли я украсить my_op, используя функцию.Defunc как-то? Не могли бы вы добавить ответ и отредактировать простой пример, который я построил? – njk

ответ

0

Насколько я могу видеть, лучший способ вы можете определить пользовательский градиент (то есть. Дать некоторую модификацию равнинных градиентов), чтобы добавить новый пользовательский оп в tensorflow следующие this. Как вы можете видеть, для пользовательского op, выводящего вход, вы можете определить его градиенты в python, используя @ops.RegisterGradient("MyOp").

+0

Спасибо 童学智. Я видел этот учебник, но, как я уже сказал, я хочу, чтобы не писать свой код на C++, потому что для стандартных операций достаточно трехмерных операций TensorFlow. Мне просто нужно определить собственный градиент для этой цепочки операций. – njk

+0

Знаете ли вы, как определить пользовательскую операцию, не записывая ее на C++? – njk

+0

Что касается документов, скажем, нет. Но это не имеет большого значения в C++, если вы только собираетесь изменить градиенты. Вы можете создать пользовательский op на основе [identity_op] (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/identity_op.h). Также обратите внимание, что ops и ядра не совпадают, вы можете использовать REGISTER_OP для регистрации op на основе некоторых существующих ядер (но это всего лишь идея, я не попробовал). –

Смежные вопросы