循环而不展开tensorflow

时间:2017-01-19 15:23:04

标签: python tensorflow

我试图理解tensorflow计算图的概念。更具体地说,如何实现循环。想象一下,我希望将常数乘以2乘以4次:

import tensorflow as tf

def tf_mul(op):
  return tf.mul(op,2.)

s=tf.placeholder_with_default(10.0,[])

通常的方法是将图表展开四次并创建一个操作并在最后对其进行评估。

for i in range(4):
  s = tf_mul(s)

with tf.Session() as sess:
  print sess.run(s)

返回160的正确答案。但是如果我检查操作,我看到Mul操作被创建了四次,这是浪费操作。 为了避免产生这些冗余的"操作,我想到的唯一方法是用以下内容替换上一个块:

my_op=tf_mul(s)
with tf.Session() as sess:
  answer=my_op.eval(session=sess)
  for i in range(3):
    answer=my_op.eval(session=sess,feed_dict={s:answer})
  print answer

这也给出了正确的答案并且只创建了一次Mul操作,然而,这是非常低效的,因为我必须评估my_op四次,即使我只关心最终答案。之所以发生这种情况,是因为我无法为feed_dict提供张量。

现在我的问题是,是否有更有效的方法来实现这个循环循环而无需额外的评估?我应该关心创建这些额外的操作吗?

2 个答案:

答案 0 :(得分:3)

TensorFlow为控制流提供了各种constructs,包括条件和循环。在您的情况下,tf.while_loop是最相关的构造。这是一个完整的工作示例:

import tensorflow as tf
sess = tf.InteractiveSession()
i = tf.constant(0)
x = tf.constant(10.0)
i, x = tf.while_loop(lambda i, _: i < 4, lambda i, x: (i + 1, x * 2.0), [i, x])
sess.run([i, x])
[4, 160.0]

答案 1 :(得分:0)

我想这是一个比你实际想要的更简单的例子,所以我会回答这个例子以及更一般的情况。

对于这种情况,可以这样做:

s=tf.placeholder_with_default(10.0,[])
exponent=tf.placeholder_with_default(4,[])
def tf_mul(op, exponent):
    return tf.pow(op * 2, exponent)

一般来说,不必使用for循环,应该使用向量操作。

在列表中添加元素的简单示例:

sum = 0
for i in list:
    sum += i

矢量化:

ones = tf.ones(shape=tf.get_shape(list))
sum = ones * list # the dot product