Tensorflow:var.eval()与var.initialized_value().eval()的区别

3
当我运行以下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]]

2
再运行一次,你会发现结果与之前不同。 - George Petrov
2个回答

10

正如您正确地解释的那样,直接评估一个变量和评估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)

相反,你应该基于v1.initialized_value()定义v2。这会强制执行初始化程序的执行顺序,并确保先初始化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)

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]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接