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

2024-04-23 20:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)]]

那我该如何初始化和使用局部变量呢?你知道吗

我使用的是TensorFlow1.0.0和Python3.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似乎是可行的,但我不知道这是否可靠。你知道吗


Tags: importgetdevicetftensorflowaswithzeros
1条回答
网友
1楼 · 发布于 2024-04-23 20:32:21

所以很明显,问题是我假设使用tf.identity会给我一个变量的引用,但是用当前的控件依赖项更新了,但事实并非如此;它只给我一个旧的(可能未初始化的)值的引用。所以正确的方法是使用read_valuetf.Variable方法,如this answer所述。所以正确的代码是:

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.read_value(), name='myvar2')

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

相关问题 更多 >