无法使用初始化的局部变量

时间:2017-04-05 10:40:44

标签: python tensorflow

我想在TensorFlow模型中使用局部变量,我发现这样做很麻烦。我将我的问题总结为以下示例:

import tensorflow as tf

with tf.device('/cpu:0'):
    v = tf.get_local_variable('myvar', [1, 1], initializer=tf.zeros_initializer())
    with tf.control_dependencies([tf.variables_initializer([v])]):
        v2 = tf.identity(v, name='myvar2')

with tf.Session() as sess:
    print(sess.run(v2))

我希望得到[[ 0. ]],但我得到错误:

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value myvar
         [[Node: myvar/read = Identity[T=DT_FLOAT, _class=["loc:@myvar"], _device="/job:localhost/replica:0/task:0/cpu:0"](myvar)]]

我应该如何初始化并使用局部变量?

我正在使用TensorFlow 1.0.0和Python 3.5。

更新:

我注意到我自己工作的初始化工作:

import tensorflow as tf

with tf.device('/cpu:0'):
    v = tf.get_local_variable('myvar', [1, 1], initializer=tf.zeros_initializer())
    v_assigned = v.assign(tf.zeros(v.get_shape(), v.dtype))
    v2 = tf.identity(v_assigned, name='myvar2')

with tf.Session() as sess:
    print(sess.run(v2))

那么,无论您如何设置依赖关系,初始化者总是在会话结束时运行?或者还有其他我想念的东西?

注意:这个解决方案对我来说是不够的(至少是这样),因为我想在变量中做切片分配,而我不能对.assign的返回值执行此操作,这是一个引用变量,而不是变量本身。我已经看到使用v_assigned作为控件依赖关系然后分配给v似乎有效,但我不知道这是否可靠。

1 个答案:

答案 0 :(得分:0)

显然问题在于我假设使用tf.identity会给我一个对变量的引用,但是会更新当前的控件依赖项,但事实并非如此;它只是给我一个旧的(可能是未初始化的)值的引用。因此,正确的方法是使用read_value的{​​{1}}方法,如this answer中所述。所以正确的代码是:

tf.Variable