为什么在tf.while_loop中将常数i用作loop_vars?

时间:2018-07-01 09:04:47

标签: python tensorflow

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)

2 个答案:

答案 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会很麻烦。