Keras vs tf.keras: 在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/upgradeKeras的計算“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 architecturemodel = 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 optimizerloss_func = tf.keras.losses.BinaryCrossentropy()optimizer = tf.keras.optimizers.Adam()創建負責執行單個批處理更新的函數:
def train_loop(features, labels):# Define the GradientTape contextwith tf.GradientTape() as tape:# Get the probabilitiespredictions = model(features)# Calculate the lossloss = loss_func(labels, predictions)# Get the gradientsgradients = tape.gradient(loss, model.trainable_variables)# Update the weightsoptimizer.apply_gradients(zip(gradients, model.trainable_variables))return loss然后開始訓練模型:
# Train the modeldef 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 trainingtrain_model()GradientTape為我們在后臺處理差異化處理,使處理自定義損失和網絡層變得容易得多。
說到自定義層和模型實現,一定要參考下一節。
TensorFlow 2.0中的模型和網絡層子類化(Model and layer subclassing )
TensorFlow 2.0和tf.keras為我們提供了三種單獨的方法來實現我們自己的自定義模型:
Sequential
Function
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 managerwith strategy.scope():# Define a model to fit the above datamodel = 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 modelmodel.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])從那里,您可以調用.fit訓練模型:
# Train the modelmodel.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。我建議您開始做同樣的事情。
英文原文鏈接:
https://www.pyimagesearch.com/2019/10/21/keras-vs-tf-keras-whats-the-difference-in-tensorflow-2-0/
備注:公眾號菜單包含了整理了一本AI小抄,非常適合在通勤路上用學習。
往期精彩回顧那些年做的學術公益-你不是一個人在戰斗適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(第一部分)備注:加入本站微信群或者qq群,請回復“加群”加入知識星球(4500+用戶,ID:92416895),請回復“知識星球”
喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的Keras vs tf.keras: 在TensorFlow 2.0中有什么区别?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 找对象困难?不如让AI算法来帮你
- 下一篇: 十分钟掌握pyecharts十类顶级图,