如何在Tensorflow中打印并加载所有变量的名称和值

时间:2017-03-31 18:07:53

标签: python tensorflow

我有两个简单的功能如下。当我调用sim_train()时,我希望名称和值应该计算为avg_mean和avg_variance。但是,输出是这样的----所有值都是0,虽然我直接打印avg_mean和avg_variance并且值是正确的。

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)

1 个答案:

答案 0 :(得分: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

要真正将moment函数的输出分配给变量,您需要使用assign op

例如:

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

然后在您的会话中,您需要调用sess.run(assign_op),该值将成功存储到变量中。 现在,Saver可以保存该值,您可以将其恢复以供以后使用。