Python 如何在tensorflow中使用tf.while\u loop()

Python 如何在tensorflow中使用tf.while\u loop(),python,tensorflow,Python,Tensorflow,这是一个一般性问题。我发现在tensorflow中,在我们构建图之后,将数据提取到图中,图的输出是一个张量。但是在很多情况下,我们需要基于这个输出(这是一个张量)进行一些计算,这在tensorflow中是不允许的 例如,我试图实现一个RNN,它根据数据自身属性循环时间。也就是说,我需要使用张量来判断我是否应该停止(我没有使用动态rnn,因为在我的设计中,rnn是高度定制的)。我发现tf.while_loop(cond,body…)可能是我实现的候选。但是官方的教程太简单了。我不知道如何在“bod

这是一个一般性问题。我发现在tensorflow中,在我们构建图之后,将数据提取到图中,图的输出是一个张量。但是在很多情况下,我们需要基于这个输出(这是一个
张量
)进行一些计算,这在tensorflow中是不允许的

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


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

是什么阻止了您向身体添加更多功能?您可以在主体中构建任意复杂的计算图,并从封闭图中获取任意输入。此外,在循环之外,您可以使用返回的任何输出执行任何您想要的操作。从“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())
将tensorflow导入为tf
将numpy作为np导入
def主体(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
返回tf.nn.relu(x+c)
def条件(x):
返回tf。减少_和(x)<100
x=tf.Variable(tf.constant(0,shape=[2,2]))
使用tf.Session():
tf.global_variables_initializer().run()
结果=tf.while_循环(条件,主体,[x])
打印(result.eval())

很好的解释。我的问题是在运行
主体
一次后,计算出我需要的
条件。这就像我需要使用body的返回值作为
条件的参数一样。循环是
while(condition(tensors)){tensors=body(tensors);}
,因此每次传递的张量都会更新为body返回的张量,然后这些更新的张量会传递到
condition
。在
body
之前调用
condition
的唯一时间是第一次,在输入上面的伪代码循环的主体之前。但是,在这种情况下,只需正确初始化传递到
loop\u vars
中的张量。例如,您可以将
body
的结果作为
loop\u vars
张量传递给
while\u loop
。哦,使用
loop\u vars
我指的是
while\u loop
的函数定义,即
while\u loop(条件、body、loop\u vars)
(这是传递给
条件
主体
)的张量。在使用子类化实现SimpleRN时,我面临一个梯度为零的问题。我想知道我是否需要符号循环,或者我是否可以不使用它来管理?