我有两个简单的功能如下。当我调用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)
答案 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可以保存该值,您可以将其恢复以供以后使用。