如何正确地为TensorFlow中的变量赋值?

时间:2017-09-21 14:27:12

标签: python tensorflow

我创建了一个用TensorFlow编写的逻辑分类模型。现在我需要手动设置模型参数的值并生成一些预测。这就是我的工作:

# instantiate the model
lr = logreg(inp_dim = 4, out_dim = 3)

# generate model parameters
w = np.array([
    [ 1.0,  2.0,  3.0],
    [ 4.0,  5.0,  6.0],
    [ 7.0,  8.0,  9.0],
    [10.0, 11.0, 12.0]
    ])
b = np.array([13.0, 14.0, 15.0])

# assign the values to the model
lr.w = tf.assign(lr.w, w)
lr.b = tf.assign(lr.b, b)

显然,这还不够。该模型仍然使用旧参数(在模型实例化时随机生成)。所以,我需要做以下额外的步骤:

init = tf.global_variables_initializer()
s = tf.Session()
s.run(init)

我认为在那一步之后,模型应该使用参数的新值(因为我已经初始化了所有全局变量)。但事实并非如此。只有在执行以下附加命令时,模型才会开始查看参数的新值:

s.run(lr.w)
s.run(lr.b)

所以,实际上我已经设法实现了我想要的东西但是,首先,我没有清楚地了解正在发生的事情,其次,我不确定这是设置值的正确方法模型参数。

有人可以解释TensorFlow中模型变量设置值背后的逻辑吗?

增加:

执行assign后,我需要执行run。只有这样变量才能获得它的价值。例如:

w = tf.assign(w, 3.0)
sess.run(w)

但是,如果我希望变量获得在实例化时给出的值,为什么同样的逻辑不适用。例如,如果我执行

w = tf.Variable(3.0, tf.float32)

变量不会得到它的值。我认为要解决这个问题,我会做同样的技巧(sess.run(w))。但事实并非如此,我需要执行以下魔术命令:

init = tf.global_variables_initializer()
sess.run(init)

1 个答案:

答案 0 :(得分:2)

这是因为当您运行s.run(init)时,您只在图表及其父级中运行初始化程序操作,但绝对没有其他操作。事实上lr.w不是init操作系统的父级,因此TensorFlow无法运行它,因此您必须像以前那样手动运行它。

编辑: 我的意思是TensorFlow graph,其中包含您定义的所有变量和操作(在您的情况下是logreg方法中的一个+您添加的2个分配)。

init = tf.global_variables_initializer() op仅初始化变量并且不运行任何其他操作(特别是稍后定义的赋值操作)。