Effective TensorFlow Chapter8——控制流操作:條件和循環

Effective TensorFlow Chapter8——控制流操作:條件和循環

本文翻譯自: , 如有侵權請聯繫刪除,僅限於學術交流,請勿商用。如有謬誤,請聯繫指出。

當我們在構建一個複雜模型如RNN(循環神經網絡)的時候,你可能需要通過條件和循環來控制操作流程。在這一節,我們介紹一些在TensorFlow中常用的控制流。

假設我們現在需要通過一個條件判斷來決定我們是否相加還是相乘兩個變量。這個可以通過調用 tf.cond()簡單實現,它表現出像python中 if...else...相似的功能。

Effective TensorFlow Chapter8——控制流操作:條件和循環

因為這個條件判斷為True,所以這個輸出應該是加法輸出,也就是輸出3。

在使用TensorFlow的過程中,大部分時間你都會使用大型的張量,並且在一個批次(a batch)中進行操作。一個與之相關的條件操作符是 tf.where(),它需要提供一個條件判斷,就和 tf.cond()一樣,但是 tf.where()將會根據這個條件判斷,在一個批次中選擇輸出,如:

Effective TensorFlow Chapter8——控制流操作:條件和循環

返回的結果是 [3,2]。

另一個廣泛使用的控制流操作是 tf.while_loop()。它允許在TensorFlow中構建動態的循環,這個可以實現對一個序列的變量進行操作。讓我們看看我們如何通過 tf.while_loops函數生成一個斐波那契數列吧:

Effective TensorFlow Chapter8——控制流操作:條件和循環

這段代碼將會返回5。 tf.while_loop()需要一個條件函數和一個循環體函數,除此之外還需初始化循環變量。這些循環變量在每一次循環體函數調用完之後都會被更新一次,直到這個條件返回False為止。

現在想象我們想要保存這個斐波那契序列,我們可能更新我們的循環體函數以紀錄當前值的歷史記錄:

Effective TensorFlow Chapter8——控制流操作:條件和循環

當你嘗試運行這個程序的時候,TensorFlow將會“抱怨”說第四個循環變量的形狀正在改變。所以你必須指明這件事後有意為之的:

Effective TensorFlow Chapter8——控制流操作:條件和循環

這使得代碼變得醜陋不堪,而且效率極低。請注意,我們正在構建許多我們不使用的中間張量。TensorFlow對這種增長式的數組,其實有一個更好的解決方案: tf.TensorArray。讓我們用張量數組做同樣的事情:

Effective TensorFlow Chapter8——控制流操作:條件和循環

TensorFlow 中的 while_loop和張量數組是構建複雜的循環神經網絡(RNN)的基本工具。作為練習,你可以嘗試使用 tf.while_loops實現 。你可以再嘗試使用張量數組提高效率嗎?


分享到:


相關文章: