2016-07-27 62 views
2

我有一個標準的TensorFlow操作鏈,我需要爲整個鏈指定一個自定義漸變。自定義漸變鏈操作

假設在下面的例子中,這些操作被分組到一個Python函數中:'my_op'。我想要做的是爲'my_op'指定一個自定義漸變。我看了一下RegisterGradient,gradient_override_map和tf.Graph.create_op,但我找不到任何關於如何使用它們爲一組操作定義自定義漸變的簡單示例,而無需在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,但我不確定我完全理解。我應該使用function.Defunc以某種方式裝飾my_op嗎?你會如此友善地添加答案並編輯我構建的簡單例子嗎? – njk

回答

0

據我所看到的,你可以自定義一個漸變的最佳方式(即給一些修改平原梯度)是在tensorflow添加新的自定義OPS以下this。正如你所看到的,對於自定義操作輸出輸入,你可以通過使用@ops.RegisterGradient("MyOp")來定義python的漸變。

+0

謝謝童學智。我已經看過該教程,但正如我所說的,我想避免在C++中編寫我的代碼,因爲標準TensorFlow操作的組合足以滿足我的需要。我只需要爲這個操作鏈定義一個自定義漸變。 – njk

+0

你知道如何定義一個自定義操作而不必用C++編寫它嗎? – njk

+0

據文件說,沒有。但是,如果你只是要改變漸變,那麼在C++中就不算什麼了。您可以根據[identity_op](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/identity_op.h)創建自定義操作。還要注意ops和內核不一樣,你可以使用'REGISTER_OP'來註冊基於一些現有內核的操作(但這只是一個想法,我沒有試過)。 –