2017-08-23 7 views
0

関数内の可変再利用動作を理解することができません。 コードがされていますので、関数FAは、xを更新し、3回呼び出され関数内のget_variable

def fa(y): 
    x = tf.get_variable("x", initializer=tf.constant([3, 4, 5])) #without reusing 
    x = tf.scatter_add(x,[0,2],y) #fine updating x 
    return x 

def fb(): 
    x = tf.get_variable("x", initializer=tf.constant([3, 4, 5])) 
    x = x.assign([1,2,3]) 
    return x 

with tf.Graph().as_default(),tf.device('/cpu:0'): 
    with tf.variable_scope('ns1',reuse=False): 
     stepa = fa([1,1]) 
#   stepb = fb() #would cause an error 

    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 
     print('fa',sess.run(stepa)) 
     print('fa',sess.run(stepa)) 
     print('fa',sess.run(stepa)) 

     print('init') 
     sess.run(tf.global_variables_initializer()) 
     print('fa',sess.run(stepa)) 
     print('fa',sess.run(stepa)) 
#   print('fb',sess.run(stepb)) 
#   print('fb',sess.run(stepb)) 
     print('fa',sess.run(stepa)) 

同じ関数faで、get_variableは変数xを再利用しているようですが、異なる関数fbではget_variable 'x'がエラーを起こします。どうして?ご協力いただきありがとうございます!

答えて

0

STEPBの= fbが()あなたはすでにグラフに存在してnameを持つ変数を作成しようとしているとして、それはエラーが発生しますエラー

を引き起こす#would。また、すでに存在する変数を再利用しないでください。

あなたは、以下の修正

with tf.variable_scope('ns1',reuse=False): 
    stepa = fa([1,1]) 
# reuse the variable named as ns1/x 
with tf.variable_scope('ns1',reuse=True): 
    stepb = fb() 
+0

ありがとうを使用することができ、グラフに存在した名前の変数を再利用したい場合は!私は再利用スコープが再利用スコープなしで動作することを知っています。get_variableはfa関数でローカルに動作し、faを3回呼び出すと再利用モードで動作するように見えます。 – zhaihouxi

+0

'fa'は最初に変数を作成するので、' reuse = False' –

+0

セッションで何回呼び出されてもfa add xはグラフ内で1回だけ推測されます。まだテンソルボードの設定に問題があります。答えてくれてありがとう! – zhaihouxi