当我运行以下Tensorflow命令时,我得到不同的结果。谁知道为什么?
import tensorflow as tf
sess = tf.Session()
var = tf.Variable(tf.truncated_normal([1,1], stddev=.1))
sess.run(tf.initialize_all_variables())
print var.eval(session=sess)
print var.initialized_value().eval(session=sess)
产地:
[[-0.12024114]]
[[ 0.04141031]]
答案 0 :(得分:10)
正确地worked out,直接评估变量和评估var.initialized_value()
之间的区别在于评估var.initialized_value()
将重新执行var.initializer
,并且 - 作为副作用 - 修改var
中存储的值。
这就留下了一个问题:为什么我们有initialized_value
?原因是它在根据另一个变量定义一个变量时有所帮助。例如,假设我们要将两个变量初始化为相同的随机值。默认情况下,tf.global_variables_initializer不指定变量初始化的顺序。因此,如果变量的初始值取决于另一个变量的值,则可能会出现错误。以下代码无法可靠地运行:
v1 = tf.Variable(tf.truncated_normal([20, 20]))
v2 = tf.Variable(v1)
init_op = tf.global_variables_initializer()
sess = tf.Session()
# The following line will non-deterministically crash with an error about
# using an uninitialized value.
sess.run(init_op)
相反,您应该根据v2
定义v1.initialized_value()
。这对初始化程序的执行方式施加了一个顺序,并确保首先初始化v1
:
v1 = tf.Variable(tf.truncated_normal([20, 20]))
v2 = tf.Variable(v1.initialized_value())
init_op = tf.global_variables_initializer()
sess = tf.Session()
# The following line will succeed.
sess.run(init_op)
答案 1 :(得分:2)
好的 - 很简单。输出不同的原因是initialized_value()重新运行初始化操作。因此结果不同。
initialized_value()方法返回用于初始化变量的值(在本例中为随机数)。
我希望在某些操作之后复制变量的值,并将其作为复制变量的方法运行到initialized_value()方法中。但是,如果要复制初始值,这似乎只是真的。虽然名字听起来很明显......
import tensorflow as tf
sess = tf.Session()
var = tf.Variable([[1.234]])
sess.run(tf.initialize_all_variables())
print var.eval(session=sess)
print var.initialized_value().eval(session=sess)
var.assign_add([[2]]).eval(session=sess)
print var.eval(session=sess)
print var.initialized_value().eval(session=sess)
产生
[[ 1.23399997]]
[[ 1.23399997]]
[[ 3.23399997]]
[[ 1.23399997]]