【问题标题】:How to use tf.while_loop() in tensorflow如何在张量流中使用 tf.while_loop()
【发布时间】:2016-09-23 07:03:42
【问题描述】:

这是一个通用问题。我发现在张量流中,我们构建图之后,将数据提取到图中,图的输出是一个张量。但是在很多情况下,我们需要根据这个输出(这是一个tensor)做一些计算,这在tensorflow中是不允许的。

例如,我正在尝试实现一个 RNN,它根据数据自身属性循环时间。也就是说,我需要使用tensor 来判断是否应该停止(我没有使用dynamic_rnn,因为在我的设计中,rnn 是高度定制的)。我发现tf.while_loop(cond,body.....) 可能是我实施的候选人。但是官方教程太简单了。我不知道如何在“身体”中添加更多功能。谁能给我几个更复杂的例子?

此外,在这种情况下,如果未来的计算基于张量输出(例如:RNN 根据输出标准停止),这是非常常见的情况。有没有一种优雅的方式或者更好的方式来代替动态图?

【问题讨论】:

  • stackoverflow.com/q/66185202/14337775。在使用子类化实现 SimpleRNN 时,我遇到了梯度为 None 的问题。我想知道我是否需要符号循环或者没有它我可以管理吗?

标签: python tensorflow


【解决方案1】:

是什么阻止了您为主体添加更多功能?您可以在正文中构建您喜欢的任何复杂计算图,并从封闭图中获取您喜欢的任何输入。此外,在循环之外,您可以使用返回的任何输出做任何您想做的事情。从“whatevers”的数量可以看出,TensorFlow 的控制流原语在构建时考虑了很多通用性。下面是另一个“简单”示例,以防万一。

import tensorflow as tf
import numpy as np

def body(x):
    a = tf.random_uniform(shape=[2, 2], dtype=tf.int32, maxval=100)
    b = tf.constant(np.array([[1, 2], [3, 4]]), dtype=tf.int32)
    c = a + b
    return tf.nn.relu(x + c)

def condition(x):
    return tf.reduce_sum(x) < 100

x = tf.Variable(tf.constant(0, shape=[2, 2]))

with tf.Session():
    tf.global_variables_initializer().run()
    result = tf.while_loop(condition, body, [x])
    print(result.eval())

【讨论】:

  • 很好的解释。我的问题是我需要的condition 是在运行body 一次后计算出来的。所以这就像是我需要使用body的返回值作为condition的参数。
  • 你想要的正是发生的事情。循环是while(condition(tensors)) { tensors = body(tensors); },所以你传递的张量每次都会更新为body返回的张量,然后将那些更新的张量传递给condition。在body 之前调用condition 的唯一时间是第一次,在进入上面的伪代码循环体之前。但是,在这种情况下,只需正确初始化您传入loop_vars 的张量。例如,您可以将body 的结果作为loop_vars 张量传递给while_loop
  • 哦,loop_vars我指的是while_loop的函数定义,也就是while_loop(condition, body, loop_vars)(就是传递给conditionbody的张量)
猜你喜欢
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2018-10-25
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多