while_loop就像这样:
i = tf.constant(0)
c = lambda i: tf.less(i, 10)
b = lambda i: tf.add(i, 1)
r = tf.while_loop(c, b, [i])
i
用作增量变量。因此,i
是可变的。
为什么我们将i
定义为常量?
为什么不i = tf.Variable(0, tf.int32)
答案 0 :(得分:1)
tf.Variable可用于创建相同类型的代码。
tf.Variable的主要属性是我知道的。参考是this
tf.Variable必须在使用之前进行初始化,方法是使用tf.assign或执行初始化程序,或者从文件加载其保存状态。
常量
i = tf.constant(0)
c = lambda i: tf.less(i, 11)
b = lambda i: tf.add(i, 1)
r = tf.while_loop(c, b, [i])
print (sess.run(r))
变量
i = tf.Variable(0, tf.int32)
c = lambda i: tf.less(i, 11)
b = lambda i: tf.add(i, 1)
r = tf.while_loop(c, b, [i])
init = tf.variables_initializer([i])
sess.run(init)
print (sess.run(r))
答案 1 :(得分:1)
i
用作增量变量。因此,i
是可变的。
不太正确-如果是,i
可能不是常量。
tf.add(i, 1)
不会更改i
,它需要张量i
并通过向其添加1来创建新的张量。 (实际上,张量流可能会为结果张量重用相同的内存分配,但这是与tf.where
的逻辑无关的优化。)
您可能会感到困惑,因为在lambda中使用了相同的名称i
,但是所有这些张量都是与每次迭代的操作输出相对应的不同张量。
因此,您声明的i
实际上是迭代的第一个值(循环中的所有其他值(不仅是计数器)都相同。它确实是一个常数,0,因此有必要声明它。将初始值0声明为Variable
会很麻烦。