Keras vs. tf.keras: 在TensorFlow 2.0中有什麼區別?

在本教程中,您將發現Keras和tf.keras之間的區別,包括TensorFlow 2.0中的新增功能。

Keras vs. tf.keras: 在TensorFlow 2.0中有什麼區別?

https://www.pyimagesearch.com/2019/10/21/keras-vs-tf-keras-whats-the-difference-in-tensorflow-2-0/

在這裏插入圖片描述

在本教程中,您將發現Keras和tf.keras之間的區別,包括TensorFlow 2.0中的新增功能。

萬衆期待的TensorFlow 2.0於9月30日正式發佈。

雖然肯定是值得慶祝的時刻,但許多深度學習從業人員(例如耶利米)都在撓頭:

  • 作爲Keras用戶,TensorFlow 2.0版本對我意味着什麼?
  • 我是否應該使用keras軟件包來訓練自己的神經網絡?
  • 還是應該在TensorFlow 2.0中使用tf.keras子模塊?
  • 作爲Keras用戶,我應該關注TensorFlow 2.0功能嗎?

從TensorFlow 1.x到TensorFlow 2.0的過渡至少有些艱難,至少要開始,但是有了正確的瞭解,您將能夠輕鬆地進行遷移導航。

在本教程的其餘部分中,我將討論Keras,tf.keras和TensorFlow 2.0版本之間的相似之處,包括您應注意的功能。


在本教程的第一部分中,我們將討論Keras和TensorFlow之間相互交織的歷史,包括他們共同的受歡迎程度如何相互滋養,彼此成長和滋養,從而使我們走向今天。

然後,我將討論爲什麼您應該在以後的所有深度學習項目和實驗中都使用tf.keras。

接下來,我將討論“計算backend”的概念,以及TensorFlow的流行度如何使其成爲Keras最流行的backend,爲Keras集成到TensorFlow的tf.keras子模塊中鋪平道路。

最後,我們將討論您作爲Keras用戶應關注的一些最受歡迎的TensorFlow 2.0功能,包括:

  • Sessions and eager execution
  • Automatic differentiation
  • Model and layer subclassing
  • Better multi-GPU/distributed training support

TensorFlow 2.0中包含一個完整的生態系統,其中包括TensorFlow Lite(用於移動和嵌入式設備)和TensorFlow Extended,用於開發生產機器學習管道(用於部署生產模型)。

讓我們開始吧!

Keras和TensorFlow之間的糾纏關係

在這裏插入圖片描述

[1]: Keras和TensorFlow之間有着複雜的歷史。 在TensorFlow 2.0中,您應該使用tf.keras而不是單獨的Keras軟件包。

理解Keras和TensorFlow之間複雜,糾纏的關係就像聆聽兩位高中情侶的愛情故事,他們開始約會,分手並最終找到了自己的路,這很長,很詳盡,有時甚至矛盾。

我們不會爲您回憶完整的愛情故事,而是會回顧CliffsNotes:

  • Keras最初是由Google AI開發人員/研究人員Francois Chollet創建和開發的。
  • Francois於2015年3月27日承諾將Keras的第一個版本發佈到他的GitHub。
  • 最初,Francois開發了Keras,以促進他自己的研究和實驗。
  • 但是,隨着深度學習的普及,許多開發人員,程序員和機器學習從業人員都因其易於使用的API而蜂擁而至Keras。
  • 那時,可用的深度學習庫還不多,熱門的庫包括Torch,Theano和Caffe。
    • 這些庫的問題在於,這就像試圖編寫程序集/ C ++來執行您的實驗一樣——繁瑣,耗時且效率低下。
    • 另一方面,Keras非常易於使用,這使得研究人員和開發人員可以更快地迭代他們的實驗。
  • 爲了訓練您自己的自定義神經網絡,Keras需要一個backend。
    • backend是一個計算引擎——它構建網絡圖/拓撲,運行優化器並執行實際的數字運算。
    • **要了解backend的概念,請考慮從頭開始構建網站。**在這裏,您可以使用PHP編程語言和SQL數據庫。您的SQL數據庫是您的backend。您可以使用MySQL,PostgreSQL或SQL Server作爲數據庫。但是,用於與數據庫進行交互的PHP代碼不會更改(當然,前提是您使用的是某種抽象數據庫層的MVC範例)。本質上,PHP並不關心正在使用哪個數據庫,只要它符合PHP的規則即可。
    • **Keras也是如此。**您可以將backend視爲數據庫,將Keras視爲用於訪問數據庫的編程語言。您可以交換自己喜歡的任何backend,只要它遵守某些規則,您的代碼就不必更改。
    • 因此,您可以將Keras視爲一組抽象的概念,這使得執行深度學習更加容易(請注意:儘管Keras始終啓用快速原型製作,但對研究人員來說不夠靈活。TensorFlow2.0對此進行了更改——在稍後的內容中將對此進行詳細介紹)。
  • 最初,Keras的默認backend是Theano,直到v1.1.0爲止都是默認的。
  • 同時,Google發佈了TensorFlow,這是一個用於機器學習和訓練神經網絡的符號數學庫。
    • Keras開始支持TensorFlow作爲backend,緩慢但可以肯定的是,TensorFlow成爲最受歡迎的backend,因此從Keras v1.1.0版本開始,TensorFlow成爲默認的backend。
  • 根據定義,一旦TensorFlow成爲Keras的默認backend,TensorFlow和Keras的使用量就會一起增長——如果沒有TensorFlow,就無法擁有Keras,並且如果在系統上安裝了Keras,那麼您還將安裝TensorFlow。
    • 同樣,TensorFlow用戶越來越被高級Keras API的簡單性吸引。
  • TensorFlow v1.10.0中引入了tf.keras子模塊,這是將Keras直接集成在TensorFlow包本身中的第一步。
    • tf.keras軟件包與您將要通過pip安裝的keras軟件包分開(即pip install keras)。
    • 原始的keras軟件包不包含在tensorflow中以確保兼容性,因此它們都可以有機地發展。
  • 但是,現在情況正在發生變化——當Google在2019年6月發佈TensorFlow 2.0時,他們宣佈Keras現在是TensorFlow的官方高級API,可以快速,輕鬆地進行模型設計和訓練。
  • 隨着Keras 2.3.0的發佈,Francois聲明:
    • 這是Keras的第一個版本,使keras軟件包與tf.keras同步
    • 這是Keras的最終版本,它將支持多個backend(例如Theano,CNTK等)。
    • 最重要的是,所有深度學習從業人員都應將其代碼切換到TensorFlow 2.0和tf.keras軟件包。
    • 原始的keras軟件包仍將收到錯誤修復,但是繼續前進,您應該使用tf.keras。

如您所知,Keras和TensorFlow之間的歷史悠久,複雜且交織在一起。

但是,作爲Keras用戶,對您來說最重要的收穫是,您應該在將來的項目中使用TensorFlow 2.0和tf.keras。

在以後的所有項目中開始使用tf.keras

在這裏插入圖片描述

[2]: TensorFlow 2.0中的Keras和tf.keras有什麼區別?

在2019年9月17日,Keras v2.3.0正式發佈-在發行版Francois Chollet(Keras的創建者和首席維護者)中指出:

Keras v2.3.0是使keras與tf.keras同步的第一個版本,
這將是最後一個支持TensorFlow以外的backend(即Theano,CNTK等)的主要版本。

最重要的是,深度學習從業人員應該開始轉向TensorFlow 2.0和tf.keras軟件包

對於大多數項目,這就像從以下位置更改導入行一樣簡單:

from keras... import ...

要使用tensorflow導入:

from tensorflow.keras... import ...

如果您使用自定義訓練循環或會話(Session),則必須更新代碼才能使用新的GradientTape功能,但是總的來說,更新代碼相當容易。

爲了幫助您(自動)將代碼從keras更新爲tf.keras,Google發佈了一個名爲tf_upgrade_v2腳本,該腳本顧名思義可以分析您的代碼並報告需要更新的行——該腳本甚至可以執行爲您進行升級的過程。

您可以參考此處以瞭解有關自動將代碼更新爲TensorFlow 2.0的更多信息

https://www.tensorflow.org/guide/upgrade

Keras的計算“backend”

在這裏插入圖片描述

[3]: Keras支持哪些計算backend? 通過tf.keras在TensorFlow中直接使用Keras是什麼意思?

正如我在本文前面提到的那樣,Keras依賴於計算backend的概念。

計算backend在構建模型圖,數值計算等方面執行所有“繁重的工作”。

然後Keras作爲abstraction坐在此計算引擎的頂部,使深度學習開發人員/從業人員更容易實現和訓練他們的模型。

最初,Keras支持Theano作爲其首選的計算backend——後來又支持其他backend,包括CNTK和mxnet等。

但是,到目前爲止,最受歡迎的backend是TensorFlow,最終成爲Keras的默認計算backend。

隨着越來越多的TensorFlow用戶開始使用Keras的易於使用的高級API,越來越多的TensorFlow開發人員不得不認真考慮將Keras項目納入TensorFlow中名爲tf.keras的單獨模塊中。

TensorFlow v1.10是TensorFlow的第一個版本,在tf.keras中包含了一個keras分支。

現在已經發布了TensorFlow 2.0,keras和tf.keras都是同步的,這意味着keras和tf.keras仍然是單獨的項目; 但是,開發人員應該開始使用tf.keras,因爲keras軟件包僅支持錯誤修復

引用Keras的創建者和維護者Francois Chollet:

這也是多後端Keras的最後一個主要版本。 展望未來,我們建議用戶考慮在TensorFlow 2.0中將其Keras代碼切換爲tf.keras。

它實現了相同的Keras 2.3.0
API(因此切換應該像更改Keras導入語句一樣容易),但是它對TensorFlow用戶具有許多優勢,例如支持eager
execution, distribution, TPU training, and generally far better
integration 在低層TensorFlow和高層概念(如“層”和“模型”)之間。

它也得到更好的維護。

如果您同時是Keras和TensorFlow用戶,則應考慮將代碼切換到TensorFlow 2.0和tf.keras。

TensorFlow 2.0中Sessions and Eager Execution

在這裏插入圖片描述

[4]: Eager execution是一種處理動態計算圖的Python方式。 TensorFlow 2.0支持Eager execution(PyTorch也是如此)。 您可以利用TensorFlow 2.0和tf.keras的Eager execution和Sessions

使用tf.keras中的Keras API的TensorFlow 1.10+用戶將熟悉創建會話以訓練其模型:

with tf.Session() as session:
	session.run(tf.global_variables_initializer())
	session.run(tf.tables_initializer())
	model.fit(X_train, y_train, validation_data=(X_valid, y_valid),
		epochs=10, batch_size=64)

創建Session對象並要求提前構建整個模型圖有點麻煩,因此TensorFlow 2.0引入了Eager Execution的概念,從而將代碼簡化爲:

model.fit(X_train, y_train, validation_data=(X_valid, y_valid),
	epochs=10, batch_size=64)

Eager Execution 的好處是不必構建整個模型圖。

取而代之的是,將立即評估操作,從而更輕鬆地開始構建模型(以及調試模型)。

有關Eager Execution的更多詳細信息,包括如何與TensorFlow 2.0一起使用,請參閱本文。

https://medium.com/coding-blocks/eager-execution-in-tensorflow-a-more-pythonic-way-of-building-models-e461810618c8

而且,如果您想比較“Eager Execution”與“Sessions”及其對訓練模型速度的影響,請參閱此頁面。

https://github.com/sayakpaul/TF-2.0-Hacks/tree/master/Speed%20comparison%20between%20TF%201.x%20and%20TF%202.0

使用TensorFlow 2.0的Automatic differentiation(自動微分)和GradientTape(梯度帶)

在這裏插入圖片描述
[5]: TensorFlow 2.0如何更好地處理自定義網絡層或損失函數? 答案在於自動微分和梯度帶

如果您是需要實施自定義網絡層或損失函數的研究人員,那麼您可能不喜歡TensorFlow 1.x(理應如此)。

至少可以說,TensorFlow 1.x的自定義實現很笨拙——還有很多不足之處。

隨着TensorFlow 2.0版本的開始變化——現在實現您自己的自定義損失要容易得多。

變得更容易的一種方法是通過自動微分和GradientTape實施。

要利用GradientTape,我們要做的就是實現我們的模型架構:

# Define our model architecture
model = tf.keras.Sequential([
    tf.keras.layers.Dropout(rate=0.2, input_shape=X.shape[1:]),
    tf.keras.layers.Dense(units=64, activation='relu'),
    tf.keras.layers.Dropout(rate=0.2),
    tf.keras.layers.Dense(units=1, activation='sigmoid')
])

定義我們的損失函數和優化器:

# Define loss and optimizer
loss_func = tf.keras.losses.BinaryCrossentropy()
optimizer = tf.keras.optimizers.Adam()

創建負責執行單個批處理更新的函數:

def train_loop(features, labels):
    # Define the GradientTape context
    with tf.GradientTape() as tape:
        # Get the probabilities
        predictions = model(features)
        # Calculate the loss
        loss = loss_func(labels, predictions)
    # Get the gradients
    gradients = tape.gradient(loss, model.trainable_variables)
    # Update the weights
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))
    return loss

然後開始訓練模型:

# Train the model
def train_model():
    start = time.time()
    for epoch in range(10):
        for step, (x, y) in enumerate(dataset):
            loss = train_loop(x, y)
            print('Epoch %d: last batch loss = %.4f' % (epoch, float(loss)))
    print("It took {} seconds".format(time.time() - start))
 
# Initiate training
train_model()

GradientTape爲我們在後臺處理差異化處理,使處理自定義損失和網絡層變得容易得多。

說到自定義層和模型實現,一定要參考下一節。

TensorFlow 2.0中的模型和網絡層子類化(Model and layer subclassing )

TensorFlow 2.0和tf.keras爲我們提供了三種單獨的方法來實現我們自己的自定義模型:

  1. Sequential
  2. Function
  3. Subclassing

Sequential和Function範式都已經在Keras中存在很長時間了,但是對於許多深度學習從業者來說,Subclassing功能仍然是未知的。

我將在下週針對這三種方法進行專門的教程,但是暫時,讓我們看一下如何使用(1)TensorFlow 2.0,(2)tf基於開創性的LeNet架構實現簡單的CNN。 keras,以及(3)模型subclassing 功能:

class LeNet(tf.keras.Model):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv2d_1 = tf.keras.layers.Conv2D(filters=6, 
                           kernel_size=(3, 3), activation='relu', 
                           input_shape=(32,32,1))
        self.average_pool = tf.keras.layers.AveragePooling2D()
        self.conv2d_2 = tf.keras.layers.Conv2D(filters=16, 
                           kernel_size=(3, 3), activation='relu')
        self.flatten = tf.keras.layers.Flatten()
        self.fc_1 = tf.keras.layers.Dense(120, activation='relu')
        self.fc_2 = tf.keras.layers.Dense(84, activation='relu')
        self.out = tf.keras.layers.Dense(10, activation='softmax')
        
    def call(self, input):
        x = self.conv2d_1(input)
        x = self.average_pool(x)
        x = self.conv2d_2(x)
        x = self.average_pool(x)
        x = self.flatten(x)
        x = self.fc_2(self.fc_1(x))
        return self.out(x)
    
lenet = LeNet()

注意LeNet類是Model的子類(subclass )。

LeNet的構造函數(即init)定義了模型內部的每個單獨層。

然後,call方法將執行前向傳遞,使您可以根據需要自定義前向傳遞

使用模型子類化(model subclassing )的好處是您的模型:

  • 變得完全可定製(fully-customizable)。
  • 使您能夠實施和利用自己的自定義損失實現。

而且,由於您的體系結構繼承了Model類,因此您仍然可以調用.fit()、. compile()和.evaluate()之類的方法,從而維護易於使用(且熟悉)的Keras API。

如果您想了解有關LeNet的更多信息,可以參考下面這篇文章。

https://www.pyimagesearch.com/2016/08/01/lenet-convolutional-neural-network-in-python/

TensorFlow 2.0引入了更好的多GPU和分佈式訓練支持

在這裏插入圖片描述

[6]: TensorFlow 2.0是否經過多個GPU訓練更好? 是的

TensorFlow 2.0和tf.keras通過其MirroredStrategy提供更好的多GPU和分佈式訓練。

https://www.tensorflow.org/guide/distributed_training#mirroredstrategy

引用TensorFlow 2.0文檔:“ MirroredStrategy支持在一臺機器上的多個GPU上的同步分佈式訓練”。

如果要使用多臺計算機(每臺計算機可能具有多個GPU),則應查看MultiWorkerMirroredStrategy。

https://www.tensorflow.org/guide/distributed_training#multiworkermirroredstrategy

或者,如果您使用Google的雲服務器進行訓練,請查看TPUStrategy。

https://www.tensorflow.org/guide/distributed_training#tpustrategy

不過,現在,假設您位於一臺具有多個GPU的機器上,並且想要確保所有GPU都用於訓練。

您可以先創建MirroredStrategy來完成此操作:

strategy = tf.distribute.MirroredStrategy()
print ('Number of devices: {}'.format(strategy.num_replicas_in_sync))

然後,您需要聲明您的模型架構,並在 strategy 範圍內對其進行編譯:

# Call the distribution scope context manager
with strategy.scope():
    # Define a model to fit the above data
    model = tf.keras.Sequential([
        tf.keras.layers.Dropout(rate=0.2, input_shape=X.shape[1:]),
        tf.keras.layers.Dense(units=64, activation='relu'),
        tf.keras.layers.Dropout(rate=0.2),
        tf.keras.layers.Dense(units=1, activation='sigmoid')
    ])
    
    # Compile the model
    model.compile(loss='binary_crossentropy',
                optimizer='adam',
                metrics=['accuracy'])

從那裏,您可以調用.fit訓練模型:

# Train the model
model.fit(X, y, epochs=5)

如果您的機器具有多個GPU,TensorFlow將爲您處理多GPU訓練。

TensorFlow 2.0是一個生態系統,包括TF 2.0,TF Lite,TFX,量化(quantization)和部署(deployment)

在這裏插入圖片描述

[7]: TensorFlow 2.0生態系統中有哪些新功能? 我應該單獨使用Keras還是應該使用tf.keras?

TensorFlow 2.0不僅僅是一個計算引擎和一個用於訓練神經網絡的深度學習庫,它還具有更多功能。

藉助TensorFlow Lite(TF Lite),我們可以訓練,優化和量化旨在在資源受限的設備上運行的模型,例如智能手機和其他嵌入式設備(例如Raspberry Pi,Google Coral等)。

https://www.tensorflow.org/lite/

或者,如果您需要將模型部署到生產環境,則可以使用TensorFlow Extended(TFX),這是用於模型部署的端到端平臺。

研究和實驗完成後,您可以利用TFX爲生產準備模型,並使用Google的生態系統擴展模型。

藉助TensorFlow 2.0,我們真正開始看到在研究,實驗,模型準備/量化和部署到生產之間更好,更高效的橋樑。

我對TensorFlow 2.0的發佈及其對深度學習社區的影響感到非常興奮。

Credits

本文中的所有代碼示例均來自TensorFlow 2.0的官方示例。 有關更多詳細信息,請確保參考Francois Chollet提供的完整代碼示例。

https://www.tensorflow.org/tutorials

https://colab.research.google.com/drive/17u-pRZJnKN0gO5XZmq8n5A2bKGrfKEUg

此外,一定要查閱Sayak Paul的TensorFlow 2.0的十個重要更新,這有助於啓發今天的博客文章。

https://www.datacamp.com/community/tutorials/ten-important-updates-tensorflow

總結

在本教程中,您瞭解了Keras,tf.keras和TensorFlow 2.0。

首先重要的一點是,使用keras軟件包的深度學習從業人員應該開始在TensorFlow 2.0中使用tf.keras。

您不僅會享受TensorFlow 2.0的更快的速度和優化,而且還將獲得新的功能更新-keras軟件包的最新版本(v2.3.0)將成爲支持多個後端和功能更新的最新版本。展望未來,keras軟件包將僅收到錯誤修復。

您應該在未來的項目中認真考慮遷移到tf.keras和TensorFlow 2.0。

第二個要點是TensorFlow 2.0不僅僅是GPU加速的深度學習庫。

您不僅可以使用TensorFlow 2.0和tf.keras訓練自己的模型,而且現在可以:

  • 採取這些模型,並使用TensorFlow Lite(TF Lite)爲移動/嵌入式部署做好準備。
  • 使用TensorFlow Extended(TF Extended)將模型部署到生產中。

從我的角度來看,我已經開始將原始的keras代碼移植到tf.keras。我建議您開始做同樣的事情。

希望您喜歡今天的教程-我很快就會回來使用新的TensorFlow 2.0和tf.keras教程。

翻譯原文:https://www.pyimagesearch.com/2019/10/21/keras-vs-tf-keras-whats-the-difference-in-tensorflow-2-0/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章