我正在经历一个示例here。我看到了以下的操作顺序:
import tensorflow as tf
v1 = tf.get_variable("v1", shape=[3], initializer = tf.zeros_initializer)
inc_v1 = v1.assign(v1+1)
init_op = tf.global_variables_initializer()
s = tf.Session()
s.run(init_op)
s.run(inc_v1)
结果,我们得到了:
array([1., 1., 1.], dtype=float32)
我不明白"assign“操作背后的逻辑。特别是,我已经将其替换为在我看来简单得多的东西:
import tensorflow as tf
v1 = tf.get_variable("v1", shape=[3], initializer = tf.zeros_initializer)
inc_v1 = v1 + 1
init_op = tf.global_variables_initializer()
s = tf.Session()
s.run(init_op)
s.run(inc_v1)
我得到了完全相同的输出。那么,为什么我们需要赋值呢?
发布于 2019-02-21 23:02:40
它接受你的原始张量和一个新的张量,用一个新值更新你的张量的原始值,并返回你的原始张量的引用。看看Tensorboard上生成的图表:
操作assign
返回对原始张量的引用:
如果没有assign
,只需创建另一个张量来添加常量值:
如果打印张量v1
的求值(在运行inc_v1
之后),它会输出[1. 1. 1.]
,因为操作的结果是它被重新分配给了原始张量。在第二种情况下,它将保持为[0. 0. 0.]
。
发布于 2019-02-21 23:19:33
这个例子确实不是很有说明性。重要的是,assign
将给定值保存到会话内的变量中,以便稍后在下一次调用run
时使用它。请看这里:
import tensorflow as tf
v1 = tf.get_variable("v1", shape=[3], initializer = tf.zeros_initializer)
inc_v1 = v1.assign(v1+1)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
sess.run(inc_v1)
print(sess.run(v1))
# [1. 1. 1.]
sess.run(inc_v1)
print(sess.run(v1))
# [2. 2. 2.]
注v1
保存了赋值,因此在进一步调用run
时可以使用它。现在比较:
import tensorflow as tf
v1 = tf.get_variable("v1", shape=[3], initializer = tf.zeros_initializer)
inc_v1 = v1+1
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
sess.run(inc_v1)
print(sess.run(v1))
# [0. 0. 0.]
sess.run(inc_v1)
print(sess.run(v1))
# [0. 0. 0.]
在这里,递增发生在对run
的一次调用中,但是它的结果从未保存在任何地方,并且v1
仍然具有值[0. 0. 0.]
。
变量很重要,因为TensorFlow中的大多数事情都是在几个步骤中完成的,例如,神经网络中的每一批处理。每一步都是对run
的调用,重要的是要保存一个步骤中对模型的更改(例如,对神经网络中权重的更新)以供下一步使用-否则您将在适当的位置运行,永远不会离开起点!
发布于 2019-02-21 22:56:58
如果要赋值的值不是来自图表,则需要赋值
https://stackoverflow.com/questions/54809628
复制相似问题