2017-03-31 36 views
0

我有兩個簡單的函數,如下所示。當我調用sim_train()時,我期望名稱和值應計算爲avg_mean和avg_variance。然而,輸出是這樣的----所有的值都是0,但是當我直接打印出avg_mean和avg_variance並且這些值是正確的。如何在Tensorflow中打印並加載所有變量的名稱和值

SSS/avg_mean:0 [ 0.] 
SSS/avg_variance:0 [ 0.] 
-2.5 1.25 

當我打電話sim_test(),這也說明

SSS/avg_mean:0 [ 0.] 
SSS/avg_variance:0 [ 0.] 

有什麼辦法,我在sim_test使用正確的值()?謝謝

def sim_train(): 
    x = tf.constant([-1,-2,-3,-4], tf.float32) 
    with tf.variable_scope("SSS"): 
    avg_mean = tf.get_variable(
     'avg_mean', [1], tf.float32, 
     initializer=tf.constant_initializer(0.0, tf.float32)) 
    avg_variance = tf.get_variable(
     'avg_variance', [1], tf.float32, 
     initializer=tf.constant_initializer(0.0, tf.float32)) 

    avg_mean, avg_variance = tf.nn.moments(x, [0], name='moments') 

    sess = tf.InteractiveSession() 
    sess.run(tf.global_variables_initializer()) 

    allVars = tf.global_variables() 
    values = sess.run(allVars) 

    for var, val in zip(allVars, values): 
    print(var.name, val) 

    print(avg_mean.eval(), avg_variance.eval()) 

    saver = tf.train.Saver() 
    saver.save(sess, "/tmp/test_EMA/sim_save.ckpt") 

def sim_test(): 
    #saver = tf.train.Saver() 
    sess = tf.InteractiveSession() 
    saver = tf.train.import_meta_graph('/tmp/test_EMA/sim_save.ckpt.meta') 
    saver.restore(sess, "/tmp/test_EMA/sim_save.ckpt") 
    allVars = tf.global_variables() 
    values = sess.run(allVars) 
    for var, val in zip(allVars, values): 
    print(var.name, val) 

回答

0

此代碼沒有做你認爲正在做的事情。

如果你

avg_mean = tf.get_variable(
    'avg_mean', [1], tf.float32, 
    initializer=tf.constant_initializer(0.0, tf.float32)) 
print type(avg_mean) 

響應將是

<class 'tensorflow.python.ops.variables.Variable'> 

但如果你

avg_mean, avg_variance = tf.nn.moments(x, [0], name='moments') 
type(avg_mean) 

響應將是

<class 'tensorflow.python.framework.ops.Tensor'> 

所以金丹將通過並保存可變成功初始化爲0

要時刻函數的輸出真正分配給變量,你需要使用分配運算

例如:

mean, variance = tf.nn.moments(x, [0], name='moments') 
assign_op = avg_mean.assign([mean]) 

然後在您的會話中,您需要撥打sess.run(assign_op)並將該值成功存儲到變量中。 Now Saver可以保存該值,並且可以將其恢復以備後用。

+0

謝謝@Kochoba。你的解釋非常清楚,現在我的代碼工作。 – Brandon

+0

@Brandon如果您發現我的答案有幫助,可以請您註冊。謝謝 – Kochoba

+0

謝謝你,Kochoba。對不起,我只能接受答案。雖然我已經上了場,但它不會公開顯示,因爲根據通知,我的身份證的聲望很低。 – Brandon