2017-01-08 7 views
2

これは、テンソルフローで高速化されたR-CNN実装です。
proposal_layerはので、私はその後、私は小さなを行う勾配が成功どのように勾配が渡されたかtf.py_func

をバック届ける考える
を変え続けるされている勾配がtf.py_func
によって重みとバイアスを渡すことができれば、私は好奇心午前のpython

implementですテスト

import tensorflow as tf 
import numpy as np 

def addone(x): 
    # print type(x) 
    return x + 1 

def pyfunc_test(): 
    # create data 
    x_data = tf.placeholder(dtype=tf.float32, shape=[None]) 
    y_data = tf.placeholder(dtype=tf.float32, shape=[None]) 

    w = tf.Variable(tf.constant([0.5])) 
    b = tf.Variable(tf.zeros([1])) 

    y1 = tf.mul(w, x_data, name='y1') 
    y2 = tf.py_func(addone, [y1], tf.float32) 
    y = tf.add(y2, b) 

    loss = tf.reduce_mean(tf.square(y - y_data)) 
    optimizer = tf.train.GradientDescentOptimizer(0.5) 
    train = optimizer.minimize(loss) 

    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 

     for step in xrange(201): 
      ran = np.random.rand(115).astype(np.float32) 
      ans = ran * 1.5 + 3 
      dic = {x_data: ran, y_data: ans} 
      tt, yy, yy1= sess.run([train, y1, y2], feed_dict=dic) 
      if step % 20 == 0: 
       print 'step {}'.format(step) 
       print '{}, {}'.format(w.eval(), b.eval()) 

     test = sess.run(y, feed_dict={x_data:[1]}) 
     print 'test = {}'.format(test) 


if __name__ == '__main__': 
    pyfunc_test() 

変数bは値AFを保つw変え続けるが、 TERは(tf.RegisterGradientgradient_override_map
を使用することをお勧めが、私はより速くrcnnレポでこれらを見つけることができないポストの上にリンクを初期化し、決して

sess.run(tf.gradients(loss, b), feed_dict=dic) GET値
sess.run(tf.gradients(loss, w), feed_dict=dic)は、私はいくつかの質問を知って{TypeError}Fetch argument None has invalid type <type 'NoneType'>

を取得変更します)
wpy_func

答えて

4

グラデーションで凍結されるように、私は何かを間違って何かをするか、行方不明です3210(ちょうどops.get_gradient_function(y2.op)をチェックする)。 @harponeのこのgistは、py_funcのグラデーションオーバーライドマップの使い方を示しています。ここで

はあなたの例では、私がharponeによって要旨は、知っているレシピ

import numpy as np 
import tensorflow as tf 

def addone(x): 
    # print(type(x) 
    return x + 1 

def addone_grad(op, grad): 
    x = op.inputs[0] 
    return x 

from tensorflow.python.framework import ops 
import numpy as np 

# Define custom py_func which takes also a grad op as argument: 
def py_func(func, inp, Tout, stateful=True, name=None, grad=None): 

    # Need to generate a unique name to avoid duplicates: 
    rnd_name = 'PyFuncGrad' + str(np.random.randint(0, 1E+8)) 

    tf.RegisterGradient(rnd_name)(grad) # see _MySquareGrad for grad example 
    g = tf.get_default_graph() 
    with g.gradient_override_map({"PyFunc": rnd_name}): 
     return tf.py_func(func, inp, Tout, stateful=stateful, name=name) 

def pyfunc_test(): 

    # create data 
    x_data = tf.placeholder(dtype=tf.float32, shape=[None]) 
    y_data = tf.placeholder(dtype=tf.float32, shape=[None]) 

    w = tf.Variable(tf.constant([0.5])) 
    b = tf.Variable(tf.zeros([1])) 

    y1 = tf.mul(w, x_data, name='y1') 
    y2 = py_func(addone, [y1], [tf.float32], grad=addone_grad)[0] 
    y = tf.add(y2, b) 

    loss = tf.reduce_mean(tf.square(y - y_data)) 
    optimizer = tf.train.GradientDescentOptimizer(0.01) 
    train = optimizer.minimize(loss) 

    print("Pyfunc grad", ops.get_gradient_function(y2.op)) 
    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 

     for step in range(10): 
      #   ran = np.random.rand(115).astype(np.float32) 
      ran = np.ones((115)).astype(np.float32) 
      ans = ran * 1.5 + 3 
      dic = {x_data: ran, y_data: ans} 
      tt, yy, yy1= sess.run([train, y1, y2], feed_dict=dic) 
      if step % 1 == 0: 
       print('step {}'.format(step)) 
       print('{}, {}'.format(w.eval(), b.eval())) 

     test = sess.run(y, feed_dict={x_data:[1]}) 
     print('test = {}'.format(test)) 


if __name__ == '__main__': 
    pyfunc_test() 
+0

おかげであなたの答えを使用するように変更されていますが、私はより速くrcnnレポで 'tf.RegisterGradient'を見つけることができないので、私は知っているだろう'tf.RegisterGradient'を使わずにpy_funcだけで勾配を与えたり、レイヤーをスキップしたりする場合 – xxi

+0

' tf.RegisterGradient'はコアTensorFlowの一部です。Pythonシェル –

+0

で 'help(tf.RegisterGradient)'を試してみてください。より速いR-CNNレポの 'tf.py_func'のグラディエントは配信できませんが、' tf.py_func'の前の値で計算される損失の一部です。したがって、 'tf.py_func'の勾配さえもnoneであれば、' tf.py_func'の前の重みを更新することができます。 – xxi

関連する問題