[譯]標準化Keras:TensorFlow 2.0中的高階API指南

雲水木石發表於2019-04-25

Tensorflow 2.0帶來的一個重大變化就是採用keras API作為TensorFlow的標準上層API,因為我在編碼中使用到keras比較多,所以對這個變化感到高興,現翻譯一篇Tensorflow團隊釋出的文件:Standardizing on Keras: Guidance on High-level APIs in TensorFlow 2.0。原文地址:medium.com/tensorflow/… ,略有刪減。點選閱讀原文可以跳轉到該文章,需要翻牆哦!

Keras是一個非常受歡迎的構建和訓練深度學習模型的高階API。它用於快速原型設計、最前沿的研究以及產品中。雖然現在的TensorFlow已經支援Keras,在2.0中,我們將Keras更緊密地整合到TensorFlow平臺。

將Keras作為TensorFlow的高階API,使得新的機器學習開發人員更容易開始使用TensorFlow。單一的高階API可以減少混亂,讓我們能夠專注於為研究人員提供高階功能。

我們希望您能像我們一樣喜歡使用它!

Keras有幾個關鍵優勢:

  • 使用者友好:Keras擁有為常見使用場景特別優化的簡單、一致的介面。它為使用者錯誤提供了清晰且可操作的反饋,以及易於理解的錯誤訊息,並且通常提供有用的建議。
  • 模組化和可組合:Keras模型將可配置的構建塊連線在一起,幾乎沒有限制。無需使用框架甚至不瞭解框架提供的所有內容的情況下,Keras的部件也可以重複使用。例如,您可以使用圖層或優化器而無需使用Keras Model 進行訓練。
  • 易於擴充套件:您可以編寫自定義構建塊來表達新的研究想法,包括新的圖層、損失函式和[在此插入您的想法]以開發最先進的想法。
  • 針對初學者和專家:深度學習開發人員具有不同的背景和經驗水平,而Keras提供了有用的API,無論您剛剛開始,還是擁有多年的經驗。

綜上,這些可以在更廣泛的使用場景,從學習ML到研究、到應用程式開發、到部署,實現更輕鬆,更高效的工作流程。

首先,我們將回答幾個問題。接下來,我們將仔細研究TensorFlow附帶的Keras版本能夠做到的事情。

FAQ

我以為Keras是一個單獨的庫?

首先,Keras是一個API規範。Keras的參考實現是作為獨立的開源專案維護的,您可以在www.keras.io上找到它。該專案獨立於TensorFlow,並擁有一個活躍的貢獻者和使用者社群。TensorFlow包含Keras API的完整實現(在tf.keras模組中),並有一些TensorFlow特有的增強功能。

Keras只是TensorFlow或其他庫的包裝器嗎?

不,這是一個常見的(但可以理解的)誤解。Keras是一個用於定義和訓練機器學習模型的API標準。 Keras與特定實現無關:Keras API具有TensorFlow、MXNet、TypeScript、JavaScript、CNTK、Theano、PlaidML、Scala、CoreML和其他庫的實現。

內建於TensorFlow的Keras版本與我在keras.io上可以找到的版本有什麼區別?

TensorFlow包含Keras API(在tf.keras模組中)的實現,並有一些TensorFlow特定的增強功能,包括支援直觀除錯和快速迭代的eager execution,支援TensorFlow SavedModel模型交換格式,以及對分散式訓練的整合支援,包括在TPU上訓練。

使用tf.keras模型子類API時,eager execution特別有用。此API的靈感來自Chainer,使您能夠強制性地編寫模型的正向傳遞。tf.keras緊密整合在TensorFlow生態系統中,還包括對以下支援:

  • tf.data,使您能夠構建高效能輸入管道。如果您願意,可以使用NumPy格式的資料訓練模型,或出於擴充套件和效能考慮,使用tf.data進行訓練。
  • 分發策略,用於在各種計算配置中分發訓練,包括分佈在許多計算機上的GPU和TPU。
  • 匯出模型。使用tf.keras API建立的模型可以序列化為TensorFlow SavedModel格式,可用TensorFlow Serving部署或用其他語言繫結(Java,Go,Rust,C#等)提供服務。
  • 匯出的模型可以部署在使用TensorFlow Lite的移動和嵌入式裝置上,也可用於TensorFlow.js(注意:您也可以使用相同的Keras API直接在JavaScript中開發模型)。
  • 特性列,用於有效地表示和分類結構化資料。
  • 還有更多。

我該如何安裝tf.keras?我還需要通過pip安裝Keras嗎?

tf.keras包含在TensorFlow中。您無需單獨安裝Keras。例如,如果在Colab Notebook中執行:

!pip install tensorflow
import tensorflow as tf
Dense = tf.keras.layers.Dense
複製程式碼

您就用上了tf.keras。如果您還不熟悉匯入,可以檢視一些最近的教程以獲取示例。

您提到TensorFlow為初學者和專家提供不同樣式的API。看起來怎麼樣?

TensorFlow開發人員具有有多種經驗水平(從第一次學習ML的學生到ML專家和研究人員)。而TensorFlow的優勢之一是它提供了多種API來支援不同的工作流程和目標。同樣,這也是TensorFlow Keras整合的主要設計目標,使用者可以選擇Keras的一部分,而不必採用整個框架。

Sequential API

如果您是學習ML的學生,我們建議您開始時使用tf.keras Sequential API。它直觀、簡潔,適用於實踐中95%的ML問題。使用此API,您可以用大約10行程式碼編寫出第一個神經網路。

[譯]標準化Keras:TensorFlow 2.0中的高階API指南

定義模型的最常用方法是構建圖層圖,最簡單的模型型別是層的堆疊。您可以使用Sequential API定義這樣的模型,如下所示:

model = tf.keras.Sequential()
model.add(layers.Dense(64, activation=’relu’))
model.add(layers.Dense(64, activation=’relu’))
model.add(layers.Dense(10, activation=’softmax’))
Such a model can then be compiled and trained in a few lines:
model.compile(optimizer=’adam’,
              loss=’sparse_categorical_crossentropy’,
              metrics=[‘accuracy’])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
複製程式碼

您可以在“學習和使用ML”部分的tensorflow.org/tutorials上找到更多的使用Sequential API的示例。

[譯]標準化Keras:TensorFlow 2.0中的高階API指南

單擊此處獲取教程,該教程將引導您使用Sequential API在Fashion MNIST資料集上訓練您的第一個神經網路。

Functional API

當然,序列模型是一種簡單的圖層堆疊,不能表示任意模型。使用Functional API可以構建更高階的模型,使您可以定義複雜的拓撲,包括多輸入和多輸出模型,具有共享層的模型以及具有殘差連線的模型。

在使用Functional API構建模型時,圖層是可以呼叫(在張量上)的,並返回張量作為輸出。然後可以使用這些輸入張量和輸出張量來定義模型。例如:

inputs = tf.keras.Input(shape=(32,))
# A layer instance is callable on a tensor, and returns a tensor.
x = layers.Dense(64, activation=’relu’)(inputs)
x = layers.Dense(64, activation=’relu’)(x)
predictions = layers.Dense(10, activation=’softmax’)(x)
# Instantiate the model given inputs and outputs.
model = tf.keras.Model(inputs=inputs, outputs=predictions)
複製程式碼

可以使用如上那樣簡單的命令來編譯和訓練這樣的模型。您可以在此處瞭解有關Functional API的更多資訊。

Model Subclassing API

使用Model Subclassing API可以構建完全可自定義的模型,您可以在類方法的主體中以此樣式強制定義自己的前向傳遞。 例如:

class MyModel(tf.keras.Model):
 def __init__(self):
   super(MyModel, self).__init__()
   # Define your layers here.
   self.dense_1 = layers.Dense(32, activation=’relu’)
   self.dense_2 = layers.Dense(num_classes, activation=’sigmoid’)
 def call(self, inputs):
   # Define your forward pass here,
   # using layers you previously defined in `__init__`
   x = self.dense_1(inputs)
   return self.dense_2(x)
複製程式碼

這些模型更靈活,但可能更難除錯。可以使用前面顯示的簡單編譯和擬合命令編譯和訓練所有三種型別的模型,或者您可以編寫自己的自定義訓練迴圈以進行完全控制。

例如:

model = MyModel()
with tf.GradientTape() as tape:
  logits = model(images, training=True)
  loss_value = loss(logits, labels)
grads = tape.gradient(loss_value, model.variables)
optimizer.apply_gradients(zip(grads, model.variables))
複製程式碼

有關Model Subclassing樣式的更多示例,請訪問tensorflow.org/tutorials(請參閱“研究和實驗”部分)。

[譯]標準化Keras:TensorFlow 2.0中的高階API指南

使用Model Subclassing API實現的Neural Machine Translation with Attention

[譯]標準化Keras:TensorFlow 2.0中的高階API指南

使用Model Subclassing API實現的GAN

如果我的研究不適合這些風格怎麼辦?

如果您發現tf.keras限制了你的應用領域,您有很多選擇。您可以:

  • 將tf.keras.layers與Keras模型定義分開使用,編寫自己的梯度和訓練程式碼。您可以單獨和獨立地使用tf.keras.optimizers,tf.keras.initializers,tf.keras.losses或tf.keras.metrics。
  • 完全忽略tf.keras,使用低階TensorFlow API,Python和AutoGraph來達到你的目標。

這完全取決於您!請注意,tf.layers中的非物件導向的層將被廢棄,並且tf.contrib.*(包括tf.contrib.slim和tf.contrib.learn等高階API)將在TF 2.0中不可用。

Estimators會發生什麼變化?

Estimators廣泛用於Google以及範圍更廣的TensorFlow社群。幾種模型已被打包為Premade Estimators,包括線性分類器、DNN分類器、組合DNN線性分類器(又名Wide and Deep Models)和Gradient Boosted Trees。這些模型已經用於產品並得到廣泛部署,由於所有這些原因,Estimator API(包括Premade Estimators)將包含在TensorFlow 2.0中。

對於Premade Estimators的使用者來說,廣受關注的Keras和eager execution對其影響將是微乎其微的。我們可能會更改Premade Estimators的實現,但會保持API介面相同。我們還將努力新增Premade Estimators實現的Keras版本,而且我們將擴充套件Keras以更好地滿足大規模產品要求。

也就是說,如果您正在開發自定義架構,我們建議使用tf.keras來構建模型而不是Estimator。如果您正在使用需要Estimators的基礎架構,您可以使用model_to_estimator()來轉換模型,同時確保Keras工作在TensorFlow生態系統中。

你還可以讀

  1. [譯]高效的TensorFlow 2.0:應用最佳實踐以及有什麼變化
  2. 嚐鮮TensorFlow 2.0

image

相關文章