我对如何在控制流语句中使用Tensor(没有会话)感兴趣。
我的意思的一个例子是:
myTensor = tf.where(myOtherTensor) # shape == [None, 2]
numLoops = tf.shape(myTensor)[0] # Results in tensor of shape [1]
for i in xrange(numLoops):
# ...
我可以将numLoops(张量)传递给xrange()吗?如果没有,还有另一种方法吗?
另一个例子是:
myTensor = tf.in_top_k(myOtherTensor1, myOtherTensor2, 5) # Tensor of bools
myCondition = myTensor[0] # Results in tensor of shape [1] of type bool
if myCondition:
# ...
我的问题:可以按照上述方式使用宣传(没有特定会话)吗?
如果我有一个会话,我可以简单地评估那些单元素张量然后使用它们。如果我在运行之前不知道具体的值,那么必须有一种方法来使用这些值。
我可以预见的问题:也许循环会使生成图表变得不可能,因为您不知道所包含的操作将被执行多少次?但是,存储循环的操作并在运行时简单地应用它们正确的次数似乎是微不足道的。
如果有任何不清楚的地方,请告诉我,我会提供更多详细信息。
答案 0 :(得分:2)
TensorFlow包含对the tensorflow.python.ops.control_flow_ops
module中的图中控制流的实验性支持。 ( N.B。这些操作的接口可能会发生变化!使用风险自负!)
条件支持(您的第二种情况)将出现在下一个版本中,并且最近被添加到公共API(如果您从源代码构建)。它目前在TensorFlow附带的一些库中使用,例如RNN cell(当序列长度已知时用于提前停止)。
tf.cond()
运算符采用布尔值Tensor
作为谓词,并使用两个lambda表达式;并返回一个或多个值。
您的程序看起来像:
if_true = lambda: ... # Value to return if `myCondition` is true
if_false = lambda: ... # Value to return if `myCondition` is false
result = tf.cond(myCondition, if_true, if_false)
可以使用While()
高阶运算符来处理迭代(您的第一个案例)。基本上,您可以将程序编写为(伪代码):
i = 0
while i < tf.rank(myTensor):
# ...
......大致表示为:
from tensorflow.python.ops import control_flow_ops as cfo
i = tf.constant(0)
condition = lambda i: tf.less(i, tf.rank(myTensor))
body = lambda x: ...
inital_accumulator = ... # will be bound to `x` in first iteration of `body`.
# `result` will contain the value returned from the final iteration of `body`.
result = cfo.While(condition, body, [initial_accumulator])
请注意,While()
运算符要求您为所有循环变量指定初始值(在本例中仅为initial_accumulator
)。循环常量将像普通的Python lambda一样被捕获。