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)
当我 运行 以下 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]]
如您正确 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)