作者:TensorFlow
編譯:ronghuaiyang
這篇文章是Effective TensorFlow 2.0的一個摘要,如果嫌原文太長又是英文的話,看看這個就好了,給大家畫了個重點。
在最近的一篇文章中(https://medium.com/tensorflow/whats-coming-in-tensorflow-2-0-d3663832e9b8),我們提到TensorFlow 2.0已經重新設計,重點是開發人員的生產力、簡單性和易用性。
要更仔細地查看更改了什麼,並了解最佳實踐,請查看新的Effective TensorFlow 2.0指南(在GitHub上發布)。本文簡要介紹了其中的內容。如果你對這些主題感興趣,請前往指南了解更多信息!
有許多TensorFlow 2.0讓用戶更有生產力的變化,包括去除冗餘的api,使api更一致的(統一RNNs),統一優化器,通過Eager execution更好地與Python運行時集成。
許多指南展示了TensorFlow 2.0開發的遠景,這裡假設你對TensorFlow 1.x有一定的了解。
API清理
在TF 2.0中,許多api要麼消失了,要麼被遷移了,其中一些api已經被2.0版本的同類api—— tf.summary, tf.keras.metrics和 tf.keras.optimizers所取代。自動應用這些重命名的最簡單方法是使用v2升級腳本。
即時執行
TensorFlow 1.X要求用戶通過tf.* API手動地將抽象語法樹(圖)拼接在一起。然後,它要求用戶手動編譯抽象語法樹,方法是將一組輸出張量和輸入張量傳遞給一個 session.run()調用。相比之下,TensorFlow 2.0執行起來就是即時的(就像Python通常做的那樣),在2.0中,圖形和會話應該感覺像實現細節。
不再有全局變量
TensorFlow 1.X嚴重依賴於隱式全局名稱空間。當你調用 tf.Variable()時,它將被放入默認圖中,並且它將保持在那裡,即使你丟失了指向它的Python變量的蹤跡。然後你就能恢復 tf.Variable,但前提是你知道創建它時使用的名稱。如果不控制變量的創建,則很難做到這一點。結果,各種各樣的機制不斷湧現,試圖幫助用戶再次找到他們的變量。
TensorFlow 2.0消除了所有這些機制,支持默認機制:跟蹤變量!如果你失去了對一個 tf.Variable的跟蹤,它就會被垃圾收集。有關詳細信息,請參見指南。
函數,而不是會話
run()調用類似於函數調用:指定要調用的輸入和函數,然後返回一組輸出。在TensorFlow 2.0中,你可以使用 tf.function()來修飾一個Python函數,將其標記為JIT編譯,以便TensorFlow將其作為一個圖運行。
這個機制允許TensorFlow 2.0獲得圖形模式的所有好處:
通過自由地穿插Python和TensorFlow代碼,你可以充分利用Python的表達能力。但是可移植的TensorFlow在沒有Python解釋器的上下文中執行——mobile、c++和JS。幫助用戶在添加 @tf.function時避免重寫代碼。AutoGraph將把Python構造的一個子集轉換為它們的TensorFlow等價結構。
有關詳細信息,請參見指南。
將代碼重構為更小的函數
TensorFlow 1.X中常見的使用模式是「kitchen sink」策略,在這個策略中,所有可能的計算的並集被預先安排好,然後通過session.run()對所選的張量進行評估。在TensorFlow 2.0中,用戶應該根據需要將代碼重構為更小的函數。一般來說,沒有必要用 tf.function來修飾這些小函數,只需要使用 tf.function來修飾高級別的計算——例如,一個訓練步驟,或者模型的前向傳遞。
使用Keras層和模型來管理變量
Keras模型和層提供了方便的變量和 trainable_variables屬性,這些屬性遞歸地收集所有的因變量。這使得在本地管理變量到它們被使用的地方變得很容易。
Keras圖層/模型繼承自 tf.train.Checkpointable並與 @tf.function集成。這使得直接檢查點或從Keras對象導出保存模型成為可能。你不必使用 Keras’s.fit() API來利用這些集成。
有關詳細信息,請參見指南。
結合 tf.data.Datasets 和@tf.function
當疊代適合內存的訓練數據時,可以隨意使用常規的Python疊代。否則, tf.data.Dataset是從磁碟中傳輸訓練數據的最佳方式。數據集是iterables(而不是iterators),並像其他Python iterables一樣在Eager模式下工作。通過將代碼封裝在 tf.function()中,你可以充分利用dataset async預抓取/流特性,該函數使用使用AutoGraph的等價圖形操作替換Python疊代。
如果使用 Keras.fit()API,就不必擔心數據集疊代。
用Python控制流來發揮AutoGraph的作用
AutoGraph提供了一種將依賴數據的控制流轉換成類似於 tf.cond和 tf.while_loop的圖形模式的方法。
數據依賴控制流出現的一個常見位置是序列模型。 tf.keras.layers.RNN封裝了一個RNN單元格,允許你靜態或動態展開遞歸式。為了演示,你可以重新實現動態展開如下:
使用 tf.metrics來聚合數據和 tf.summary來記錄數據
最後,一套完整的 tf.summary符號很快就會出現。你可以訪問 tf.summary的2.0版本:
有關詳細信息,請參見指南。
英文原文:https://medium.com/tensorflow/effective-tensorflow-2-0-best-practices-and-whats-changed-a0ca48767aff
請長按或掃描二維碼關注本公眾號