Tensorflow 2.0 在今年一月在官方部落格上公告了 2.0 的版本。在官方 "What’s coming in TensorFlow 2.0" 的文章上,可以看到將會把重點放在:
下方則是由 Tensorflow 2.0 官方提供的架構圖。
tf.Session
,讓我們歡迎 tf.function
!在過去,Tensorflow 將計算圖建置和 runtime 餵送資料的過程分開來,而這樣的設計便是使用 tf.Session
來處理所有資料的流向。然而,在 2.0 為了能更簡化使用者介面,就是讓 tf.Session
有如使用 python 一般直覺,那就是以 tf.function
取代。
我們在 Jax 的文章中有一小段原始碼例子,解說如何使用 Jax 的 grad
函式。藉著餵入一個 python function 後,Jax 的 grad
函式會輸出另一個 python function 可以計算輸出梯度計算的結果。
我們可以把使用者輸入的 python function 當作是一個計算子圖,透過直接呼叫 tf.function
或用 decorator 的方式包覆在目標 python function ,而動態建立一個 tf.Grpah
物件,除了可供反向傳播時使用,亦可以透過編譯並最佳化計算過程。
另外關於誰在 Tensorflow 2.0 中被移除,最明顯的應該是 tf.contrib
被移除了,而且發生在 1.4,你已經無法使用任何在 contrib module 底下的 code 了。作為一個開源的深度學習框架,tf.contrib
module 一項是社群貢獻 Tensorflow 的結晶,依靠社群的貢獻,有許多實驗性的良好設計,最後都被收入在 Tensorflow 的官方函式庫中。Tensorflow 在這個 RFC 中提到,因為 contrib 模組愈變愈加龐大,造成維持不易,最終決定將到 tensorflow addon。
以下是從官方取得的原始碼做解說,現在少了 tf.Session
後,我們可以這麼做
# TensorFlow 1.X
outputs = session.run(f(placeholder), feed_dict={placeholder: input})
# TensorFlow 2.0
outputs = f(input)
其他官方提到還有哪些地方被移除,包括了:
為了達成官方所說的一個「更簡單,且更強大」的 High-level API,Tensorflow 2.0 在 keras 和 eager execution 提出了多項修改。首先,一個為了能達成一個更簡單的 High-level API ---
keras 仍會維持為 Tensorflow 最喜愛的官方 high-level API,而其本身已經擁有許多良好的 features 可供研究者使用,包括了 Sequential
和 Functional
兩種 API。
為了能讓 keras 和 tensorflow 能夠更無縫地結合,tensorflow 做了以下修改:
在 eager mode 內,仍可以使用 tf.GradientTape
和 tf.custom_gradient
兩個函式可以給予使用者較大的自由度去客制化梯度的計算。
另外一個大改變則是 tf.Variable
的狀態管理。在過去 1.x 的時代,tf.Variable
的狀態是由 tf.Graph
的 graph collection 來管理,而其生命週期則由 tf.Session
管理。如今,在 2.0 graph collection 被移除掉後,tf.Variable
會被當成一般 Python 物件處理。
tf.data
tf.data
是專注於巨量資料的 API,為了能夠用在 tf.keras
建置的模型內, Tensorflow 2.0 允許透過tf.keras.Sequential
或 tf.keras.Functional
類別實體在呼叫 fit
方法進行訓練,以及 evaluate
和 predict
時使用 tf.Data.Dataset
實例。
關於在 Tensorflow 的框架中使用 keras,仍要注意盡量使用 tf.keras
版本,而非 stand alone keras。這樣可以保證 tensorflow 支援的 keras 版本符合,且在輸出模型時,會保證預設為tensorflow 的 checkpoint 格式,而非 keras 預設所用的 HDF5。
關於如何使用 Tensorflow 2.0,官方部落格提供了以下的建議 workflow:
tf.data
來進行資料的餵送,以及使用 tf.feature_column
來做手動的簡易 feature engineering,包括了 encoding categorical data,和產生兩特徵關聯(feature cross)。tf.data
可以接受 numpy 或是稍後從硬碟讀入。tf.keras
和 tf.Estimator
API 來實驗模型。tf.Estimator
有許多 pre-made Estimator,包括了 boosted tree 等。若想要用已經訓練好的模型,還可以使用 TensorFlow Hub。tf.Funciton
物件一並服用,tf.Funciton
會將你的函式轉為計算圖,並可以透過編譯成為可以在不同裝置執行,宛如 1.x 的計算圖,享有高計算能力,更容易 export 以及 deployment。面對既有以 Tensorflow 1.x 的模型所寫成的,無論已經是 production code 或是模型建置的 research code,Tensorflow 提供自動轉換 script,(希望)能提供無痛轉換。明天,我們將要來 walk through 這個 migration process。以及,如果踢到自動轉換的鐵板,仍然可以使用 tensorflow.compat.v1
保持原來的函示。
[1]What’s coming in TensorFlow 2.0
[2]Effective Tensorflow 2.0