python - Why use constant i in `tf.while_loop` as `loop_vars`?
问题描述
The while_loop is like this:
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
is used as a incremental variable. So, i
is changeable.
Why we define i
as a constant?
Why not i = tf.Variable(0, tf.int32)
解决方案
i
用作增量变量。所以,i
是多变的。
不完全正确——如果是这样,i
就不可能是一个常数。
tf.add(i, 1)
不会改变i
,它需要张量i
并通过添加 1 来创建一个新的张量。(在实践中,tensorflow 可能会为生成的张量重用相同的内存分配,但这是与逻辑无关的优化tf.where
)。
您可能会感到困惑,因为i
在 lambdas 中使用了相同的名称,但所有这些张量都是不同的张量,对应于每次迭代的操作输出。
因此,i
您声明的实际是迭代的第一个值(循环中的所有其他值也是如此,不仅适用于您的计数器)。它确实是一个常数 0,因此这样声明它是有意义的。将您的初始值 0 声明为Variable
.
推荐阅读
- python - 为什么我在 Python 中不断收到 nt4stopc 错误?
- javascript - 如何正确存储 Firebase 实时数据库中的数据并在检索到数据后使用 React 进行渲染?
- string - 将一个字符串交错到另一个字符串所需的最小子序列数
- awk - 如何 grep/sed/awk/print 行中包含两个单词或最多单词
- angular - 如何通过服务中的 renderer2 将 eventlistener 应用到通过指令异步构建的 html
- java - 如何比较Java中的两种方法
- npm-scripts - 从控制台“CTRL+C”终止时运行 npm 脚本
- xml - 在 xml 实例/文档中找到 *used* 的 xsd/schema 类型子集(跳过未使用的 xsd 类型)
- docker - docker compose 无法识别本地环境文件
- sql-server - 如何在 linux 中跟踪 mssql 服务器日志?