我希望能够使用tf.initialize_variables()
使用特定列表初始化tensorflow变量。所以,为了测试这个案例,我正在尝试这个,但它失败了:
sess.run(tf.initialize_variables(tf.all_variables()))
错误:
tensorflow.python.framework.errors.FailedPreconditionError: Attempting to use uninitialized value Layer_0/Initialize_Variables/weights
对我来说真的很奇怪,它是这样运作的:
sess.run(tf.initialize_variables([tf.all_variables()[0]]))
sess.run(tf.initialize_variables([tf.all_variables()[1]]))
sess.run(tf.initialize_variables([tf.all_variables()[2]]))
...
因此,如果我创建自己要初始化的变量列表,也会发生同样的情况。可能我误解了张量流机制的某些东西。有任何想法吗?如果我不必为每个变量使用循环,我会很高兴。
答案 0 :(得分:2)
在没有看到代码的情况下很难分辨,但我的猜测是你正在从另一个变量初始化一个变量,这在TensorFlow中有点棘手。例如,我想你正在做这样的事情:
v_1 = tf.Variable(...)
v_2 = tf.Variable(v_1)
如果您尝试执行sess.run(tf.initalize_all_variables())
,则会失败,因为它会尝试并行初始化v_1
和v_2
,但v_2
的初始化将失败(因为它输入目前未初始化。)
如果以递增顺序迭代tf.all_variables()
列表,它将起作用,因为v_1
被添加到v_2
之前的列表中,因此顺序运行将导致{{1}在v_1
之前初始化。 (猜测一下,如果你以反向顺序迭代v_2
,它就会因类似错误而失败。)
修复有点微妙:每当您从另一个变量tf.all_variables()
初始化变量v_2
时,您应该使用v_1.initialized_value()
作为v_1
&#39的参数; s构造函数:
v_2
使用v_1 = tf.Variable(...)
v_2 = tf.Variable(v_1.initialized_value())
在两个初始值设定项之间添加控件依赖关系,以便v_1.initialized_value
在v_1
之前初始化,即使您尝试并行初始化它们。