2017-01-19 92 views
2

我想了解張量流計算圖的概念。更具體地說,如何實現一個循環。想象一下,我要乘以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輸入張量。

現在我的問題是如果有一個更有效的方式來實現這個經常性循環沒有額外的評估?我應該關心創建這些額外的操作嗎?

+1

您可以用'tf.while_loop' –

回答

2

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] 
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 
+1

是的,正如你想象的,這個問題只是一個[MWE(https://en.wikipedia.org/wiki/Minimal_Working_Example)。函數tf_mul可能是一個強大的圖表。 – Phoenix666