2017-03-31 124 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