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