我创建了一个用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)
答案 0 :(得分:2)
这是因为当您运行s.run(init)
时,您只在图表及其父级中运行初始化程序操作,但绝对没有其他操作。事实上lr.w
不是init
操作系统的父级,因此TensorFlow无法运行它,因此您必须像以前那样手动运行它。
编辑:
我的意思是TensorFlow graph,其中包含您定义的所有变量和操作(在您的情况下是logreg
方法中的一个+您添加的2个分配)。
init = tf.global_variables_initializer()
op仅初始化变量并且不运行任何其他操作(特别是稍后定义的赋值操作)。