2017-06-21 78 views
4

我試圖用tensorflow生成斐波納契數:F(n + 2)= F(n + 1)+ F(n)。每次運行我的代碼時,它都會產生不同的結果,非常奇怪。代碼很簡單,並粘貼在下面。這是張力流中的錯誤嗎?

import tensorflow as tf 

a = tf.Variable(1) 
b = tf.Variable(1) 
c = tf.Variable(2) 
sum=tf.add(a,b) 

as0 = tf.assign(a,b) 
as1=tf.assign(b, c) 
as2=tf.assign(c, sum) 

sess = tf.Session() 
init = tf.global_variables_initializer() 
sess.run(init) 
for i in range(10): 
    print(sess.run([as2, as1,as0])) 
+0

你是什麼意思它返回不同的結果?我只是嘗試過,每次都是一樣的。似乎沒有正確地產生你的序列,雖然 – JCooke

+0

這是一個有趣的!我每次都會得到不同的值,總是不正確的,並且總是第二和第三個元素相等,as2 [i] = as1 [i] + as1 [i-1]。我的猜測是,當你調用sess.run()時,你只是不知道圖表執行的順序是什麼,所以分配和總和是以錯誤的(每次可能不同的)順序執行的,到目前爲止這是可能的你們知道嗎? – gdelab

+0

順便說一句,問題的標題太寬泛,你應該改變它來描述你的問題更好 – gdelab

回答

0

這是一個有趣的!

當你調用sess.run()時,你似乎只是不知道圖的執行順序,或者至少你不知道每個張量的計算結果是以何種順序完成的,所以分配和總和在錯誤(每次可能不同)順序中執行。下面的代碼工作正常,通過強制圖形做的事情以正確的順序:

import tensorflow as tf 
a = tf.Variable(1) 
b = tf.Variable(1) 
c = tf.Variable(2) 
sum=tf.add(a,b) 
as0 = tf.assign(a,b) 
as1=tf.assign(b, c) 
as2=tf.assign(c, sum) 
sess = tf.Session() 
init = tf.global_variables_initializer() 
sess.run(init) 
for i in range(10): 
    sess.run(as0) 
    sess.run(as1) 
    print(sess.run(as2)) 

這是不是很實用,因爲它是從圖表的。 您可能會使用flow control ops強制它們按正確的順序執行。

3

我認爲@gdelab回答的不是完全是沒錯。我的意思是,解決問題的確是事實,但我認爲這不是真正的原因。這是我的猜測。

我強烈地認爲你試圖在Jupyter筆記本上運行該代碼。如果那不是真的,那麼可能我錯了。那麼,假設是這樣的:

  1. 第一次運行代碼時,它給出了正確的輸出。 First Time

  2. 第二次運行代碼時,它會給出另一個輸出。 enter image description here

  3. 但那是因爲你沒有從頭開始運行。這是,內核不重新啓動並且變量不會被擦除,所以輸出更改。如果你「重啓核」,然後再次運行該代碼時,輸出始終是相同的(第一圖像的輸出)enter image description here

現在,請不要告訴我你不使用Jupyter筆記本:)

0

如果一些操作可以與另一個並行執行,他們可能會。因此,執行順序不是您編寫的操作的順序。

執行的順序僅在明確強制執行時(與tf.control_dependencies一致)或者在計算另一個節點(當節點是另一個節點的先決條件時)之前必須計算節點時存在。

讓我們深入到代碼:

a = tf.Variable(1) 
b = tf.Variable(1) 
c = tf.Variable(2) 
sum=tf.add(a,b) 

到現在爲止,你剛纔定義3個變量和操作。 請注意:你的定義了一個節點。什麼都沒有發生。

as0 = tf.assign(a,b) 
as1=tf.assign(b, c) 
as2=tf.assign(c, sum) 

在這裏,您定義 3分配操作。他們之間有無訂單。 沒有人知道之前和之後會執行什麼,因爲它們之間沒有因果關係。

您唯一可以確定的是,在將sum的值分配給c之前,必須執行總和。

因此,在您的圖形中,只有一個箭頭從sum節點到assign(c,sum)節點。

P.S:這不是像斐波那契數列那樣計算操作的推薦方式。相反,你應該使用tf.scan,它有一個可以幫助你很多的參數accumulator