我试图在python中为tensorflow变量赋一个新值.
import tensorflow as tf import numpy as np x = tf.Variable(0) init = tf.initialize_all_variables() sess = tf.InteractiveSession() sess.run(init) print(x.eval()) x.assign(1) print(x.eval())
但我得到的输出是
0 0
所以价值没有改变.我错过了什么?
该声明x.assign(1)
实际上并没有赋值1
给x
,而是创建了一个tf.Operation
,你必须明确地运行更新变量*要在通话.Operation.run()
或Session.run()
可用于运行操作:
assign_op = x.assign(1) sess.run(assign_op) # or `assign_op.op.run()` print(x.eval()) # ==> 1
(*实际上,它返回一个tf.Tensor
,对应于变量的更新值,以便更容易链接赋值.)
您也可以在tf.Variable
不向图表添加操作的情况下为a分配新值:tf.Variable.load(value, session)
.此函数还可以在从图形外部指定值时保存添加占位符,并且在图形完成时非常有用.
import tensorflow as tf
x = tf.Variable(0)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(x)) # Prints 0.
x.load(1, sess)
print(sess.run(x)) # Prints 1.
首先,您可以将值赋给变量/常量,只需将值输入到它们中,就像使用占位符一样.所以这是完全合法的:
import tensorflow as tf x = tf.Variable(0) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print sess.run(x, feed_dict={x: 3})
关于你与tf.assign()运算符的混淆.在TF中,在会话内部运行之前不会执行任何操作.所以你总是要做这样的事情:op_name = tf.some_function_that_create_op(params)
然后在你运行的会话内sess.run(op_name)
.使用assign作为示例,您将执行以下操作:
import tensorflow as tf x = tf.Variable(0) y = tf.assign(x, 1) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print sess.run(x) print sess.run(y) print sess.run(x)