TensorFlow用户添加
的情况很多(here和here)init_op = tf.global_variables_initializer()
在定义任何变量或操作之前,然后按
的方式获取错误Attempting to use uninitialized value
有一个解释here,但它没有提到潜在的tf.global_variables_initializer
来电。它几乎复制TF API批发。这个问题集中在以下事实:当某些用户呼叫sess.run(init_op)
时,仍然存在未初始化的值。示例代码和对tf.global_variables_initializer
将会很棒的分析。
答案 0 :(得分:11)
TensorFlow API在tf.global_variables_initializer
上有一个非常短的部分。它只是提到:
这只是
variable_initializer(global_variables())
的快捷方式。
将其追踪到tf.variables_initializer
,我们可以看到此功能的用法是这样的:
tf.variables_initializer(var_list, name='init')
这意味着我们将tf.global_variables
作为var_list
传递给tf.variables_initializer
。如果我们在调用tf.global_variables_initializer
之前没有定义任何变量,var_list
基本上是空的。下面的代码说明了这一点:
import tensorflow as tf
with tf.Graph().as_default():
# Nothing is printed
for v in tf.global_variables():
print v
init_op = tf.global_variables_initializer()
a = tf.Variable(0)
b = tf.Variable(0)
c = tf.Variable(0)
# 3 Variables are printed here
for v in tf.global_variables():
print v
with tf.Session() as sess:
sess.run(init_op)
print sess.run(a)
打印出来的3个变量是这样的:
<tf.Variable 'Variable:0' shape=() dtype=int32_ref>
<tf.Variable 'Variable_1:0' shape=() dtype=int32_ref>
<tf.Variable 'Variable_2:0' shape=() dtype=int32_ref>
按原样运行上述代码会导致出现上述错误:
Attempting to use uninitialized value
将init_op
的位置换成a b c
之后:
a = tf.Variable(0)
b = tf.Variable(0)
c = tf.Variable(0)
init_op = tf.global_variables_initializer()
会使它发挥作用。
答案 1 :(得分:5)
该文档实际上非常详细且有用section about variable initialization。你特别了解
必须先运行变量初始值设定项,然后才能运行模型中的其他操作。最简单的方法是添加一个运行所有变量初始值设定项的op,并在使用模型之前运行该op。 (..)使用
tf.global_variables_initializer()
添加运行变量初始值设定项的操作。
所以基本上tf.global_variables_initializer()
遍历所有变量,然后调用
sess.run(my_var.initializer)
tf.global_variables_initializer()
会立即自动执行此操作。此功能可以节省时间,但从技术上讲,您不会 调用它,并可以通过其他方式初始化变量(最常见的示例:从文件恢复权重)。
它如何了解所有变量?默认情况下,创建Variable
时,会将其添加到tensorflow的GLOBAL_VARIABLES
集合中。所以global_variables_initializer
基本上是遍历这个集合的变量并调用它们的初始值。
但是Variable
允许您选择要放入的集合。如果您从GLOBAL_VARIABLES
中排除变量,则创建的变量将 not 由tf_global_variables_initializer()
初始化:
import tensorflow as tf
x = tf.Variable(0)
my_vars = []
y = tf.Variable(0, collections=my_vars)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run() # does not initialize y!
print(x.eval())
# 0
print(y.eval())
# FailedPreconditionError: Attempting to use uninitialized value Variable_2