2016-09-21 10 views
4

テンソルフローでDefunデコレータを使用する際に問題があります。つまり、Defunは外部で作成されたTF操作をクローズすることはできません。以下は、私が何をしたいのかを示す自己完結型の例です。テンソルxは、custom_opの呼び出しの内側と外側の異なるグラフに属することに注意してください。 Defunコードは、一時的なグラフを作成し、グラフを関数protoに変換し、元のグラフにマージします。最初のステップでコードがクラッシュします。これは、閉じたテンソルが新しい一時グラフにないためです。これを回避する方法はありますか?物事を終えることができれば、非常に役に立ちます。テンソルフローデフンを閉鎖として扱う

import tensorflow as tf 
    from tensorflow.python.framework import function 

    w = tf.Variable(1.0) 
    function_factory = lambda x: x*w 

    @function.Defun(x=tf.float32) 

    def custom_op(x): 
     print('graph for x inside custom_op: ', x.graph) 
     return function_factory(x) 

    x = tf.constant(2.0) 

    print('graph for x outside custom_op: ', x.graph) 
    y = custom_op(x) 

    with tf.Session() as sess: 
     sess.run(tf.initialize_all_variables()) 
     sess.run(y) 

答えて

1

いいえ、Defunデコレータはすべてをキャプチャしません。あなたはあなたの例では、以下のように、明示的wに合格する必要があります。

import tensorflow as tf 
from tensorflow.python.framework import function 

w = tf.Variable(1.0) 

@function.Defun(tf.float32, tf.float32) 
def custom_op(x, w): 
    print('graph for x inside custom_op: ', x.graph) 
    return x * w 

x = tf.constant(2.0) 
print('graph for x outside custom_op: ', x.graph) 
y = custom_op(x, tf.identity(w)) 

with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    sess.run(y) 

(。必要性が高い場合には、我々が取得するためのより完全なサポートを追加する場合があります)