Tensorflow:var.eval() 与 var.initialized_value().eval()

Tensorflow: var.eval() vs. var.initialized_value().eval()

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

好的 - 简单。不同输出的原因是 initialized_value() re-runs 初始化操作。因此不同的结果。

initialized_value() 方法 returns 用于初始化变量的值(在本例中为 运行dom 数)。

我想在一些操作后复制变量的值,运行 到 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]]

如您正确 , the difference between evaluating a variable directly and evaluating var.initialized_value() is that evaluating var.initialized_value() will re-execute 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)