我希望能够构建一个TF图,如果尚未初始化随机变量,则该图将自动初始化,否则将使用该变量而无需重新初始化。我该怎么做?
我正在图书馆。给定一个未知尺寸的任意输入张量,我想生成一个相同尺寸的随机张量并对其进行处理。但是,在随后调用session.run(...)
时,我希望该随机张量保持不变。我首先只是做了rand_tens = tf.random_normal(tf.shape(input_tensor))
,但是随后每个每次rand_tens
的调用中session.run
都是不同的。所以我开始使用Variable
。
只需创建一个变量,然后让调用者使用tf.global_variables_initializer
对其进行初始化。这样做的问题在于变量的形状取决于输入张量,因此这会在运行global_variables_initializer
时强制调用者提供输入。 (我不希望采用静态已知的形状。)而且,如果输入张量的形状发生变化,则需要选择重新初始化,而调用者必须进行重新初始化。
检测随机变量是否未初始化(或者如果形状已更改,则进行检测),如果初始化,则进行检测。简化版显示了我遇到的困难:
import tensorflow as tf
with tf.Graph().as_default():
rand = tf.random_normal(())
var = tf.Variable(name='var', initial_value=rand)
should_init_var = tf.logical_not(tf.is_variable_initialized(var))
def init():
init_op = tf.group(tf.variables_initializer([var]), tf.print('Initializing'))
with tf.control_dependencies([init_op]):
return var.read_value()
def no_init():
with tf.control_dependencies([tf.print('Not initializing')]):
return var.read_value()
auto_init_var = tf.cond(should_init_var, init, no_init)
with tf.Session() as s:
print(s.run(auto_init_var))
print(s.run(var))
print('--')
print(s.run(auto_init_var))
print(s.run(var))
这将输出:
Initializing
0.12299147
0.12299147
--
Not initializing
0.6971085
0.6971085
在auto_init_var
的第二次运行中,它似乎没有重新初始化,但是值有所不同!非常奇怪……我猜想它与this有关,但是我确实将init op放在了cond
分支的主体内,所以我不确定是什么问题。 ..
我也看到过this,但这涉及到多个对session.run
的呼叫,我不想对呼叫者进行呼叫。