我想在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
似乎有效,但我不知道这是否可靠。
答案 0 :(得分:0)
显然问题在于我假设使用tf.identity
会给我一个对变量的引用,但是会更新当前的控件依赖项,但事实并非如此;它只是给我一个旧的(可能是未初始化的)值的引用。因此,正确的方法是使用read_value
的{{1}}方法,如this answer中所述。所以正确的代码是:
tf.Variable