在TensorFlow中自动初始化随机变量

时间:2018-11-27 02:38:23

标签: python tensorflow

问题

我希望能够构建一个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的呼叫,我不想对呼叫者进行呼叫。

0 个答案:

没有答案