Keras vs tf.keras: 在TensorFlow 2.0中有什么区别?
導(dǎo)讀
在本文中,您將發(fā)現(xiàn)Keras和tf.keras之間的區(qū)別,包括TensorFlow 2.0中的新增功能。
萬眾期待的TensorFlow 2.0于9月30日正式發(fā)布。
雖然肯定是值得慶祝的時刻,但許多深度學(xué)習(xí)從業(yè)人員(例如耶利米)都在撓頭:
作為Keras用戶,TensorFlow 2.0版本對我意味著什么?
我是否應(yīng)該使用keras軟件包來訓(xùn)練自己的神經(jīng)網(wǎng)絡(luò)?
還是應(yīng)該在TensorFlow 2.0中使用tf.keras子模塊?
作為Keras用戶,我應(yīng)該關(guān)注TensorFlow 2.0功能嗎?
從TensorFlow 1.x到TensorFlow 2.0的過渡至少有些艱難,至少要開始,但是有了正確的了解,您將能夠輕松地進(jìn)行遷移導(dǎo)航。
在本教程的其余部分中,我將討論Keras,tf.keras和TensorFlow 2.0版本之間的相似之處,包括您應(yīng)注意的功能。
在本教程的第一部分中,我們將討論Keras和TensorFlow之間相互交織的歷史,包括他們共同的受歡迎程度如何相互滋養(yǎng),彼此成長和滋養(yǎng),從而使我們走向今天。
然后,我將討論為什么您應(yīng)該在以后的所有深度學(xué)習(xí)項目和實驗中都使用tf.keras。
接下來,我將討論“計算backend”的概念,以及TensorFlow的流行度如何使其成為Keras最流行的backend,為Keras集成到TensorFlow的tf.keras子模塊中鋪平道路。
最后,我們將討論您作為Keras用戶應(yīng)關(guān)注的一些最受歡迎的TensorFlow 2.0功能,包括:
Sessions and eager execution
Automatic differentiation
Model and layer subclassing
Better multi-GPU/distributed training support
TensorFlow 2.0中包含一個完整的生態(tài)系統(tǒng),其中包括TensorFlow Lite(用于移動和嵌入式設(shè)備)和TensorFlow Extended,用于開發(fā)生產(chǎn)機(jī)器學(xué)習(xí)管道(用于部署生產(chǎn)模型)。
讓我們開始吧!
Keras和TensorFlow之間的糾纏關(guān)系
[1]Keras和TensorFlow之間有著復(fù)雜的歷史。在TensorFlow 2.0中,您應(yīng)該使用tf.keras而不是單獨的Keras軟件包。理解Keras和TensorFlow之間復(fù)雜,糾纏的關(guān)系就像聆聽兩位高中情侶的愛情故事,他們開始約會,分手并最終找到了自己的路,這很長,很詳盡,有時甚至矛盾。
我們不會為您回憶完整的愛情故事,而是會回顧C(jī)liffsNotes:
Keras最初是由Google AI開發(fā)人員/研究人員Francois Chollet創(chuàng)建和開發(fā)的。
Francois于2015年3月27日承諾將Keras的第一個版本發(fā)布到他的GitHub。
最初,Francois開發(fā)了Keras,以促進(jìn)他自己的研究和實驗。
但是,隨著深度學(xué)習(xí)的普及,許多開發(fā)人員,程序員和機(jī)器學(xué)習(xí)從業(yè)人員都因其易于使用的API而蜂擁而至Keras。
那時,可用的深度學(xué)習(xí)庫還不多,熱門的庫包括Torch,Theano和Caffe。
這些庫的問題在于,這就像試圖編寫程序集/ C ++來執(zhí)行您的實驗一樣——繁瑣,耗時且效率低下。
另一方面,Keras非常易于使用,這使得研究人員和開發(fā)人員可以更快地迭代他們的實驗。
為了訓(xùn)練您自己的自定義神經(jīng)網(wǎng)絡(luò),Keras需要一個backend。
backend是一個計算引擎——它構(gòu)建網(wǎng)絡(luò)圖/拓?fù)?#xff0c;運行優(yōu)化器并執(zhí)行實際的數(shù)字運算。
要了解backend的概念,請考慮從頭開始構(gòu)建網(wǎng)站。在這里,您可以使用PHP編程語言和SQL數(shù)據(jù)庫。您的SQL數(shù)據(jù)庫是您的backend。您可以使用MySQL,PostgreSQL或SQL Server作為數(shù)據(jù)庫。但是,用于與數(shù)據(jù)庫進(jìn)行交互的PHP代碼不會更改(當(dāng)然,前提是您使用的是某種抽象數(shù)據(jù)庫層的MVC范例)。本質(zhì)上,PHP并不關(guān)心正在使用哪個數(shù)據(jù)庫,只要它符合PHP的規(guī)則即可。
Keras也是如此。您可以將backend視為數(shù)據(jù)庫,將Keras視為用于訪問數(shù)據(jù)庫的編程語言。您可以交換自己喜歡的任何backend,只要它遵守某些規(guī)則,您的代碼就不必更改。
因此,您可以將Keras視為一組抽象的概念,這使得執(zhí)行深度學(xué)習(xí)更加容易(請注意:盡管Keras始終啟用快速原型制作,但對研究人員來說不夠靈活。TensorFlow2.0對此進(jìn)行了更改——在稍后的內(nèi)容中將對此進(jìn)行詳細(xì)介紹)。
最初,Keras的默認(rèn)backend是Theano,直到v1.1.0為止都是默認(rèn)的。
同時,Google發(fā)布了TensorFlow,這是一個用于機(jī)器學(xué)習(xí)和訓(xùn)練神經(jīng)網(wǎng)絡(luò)的符號數(shù)學(xué)庫。
Keras開始支持TensorFlow作為backend,緩慢但可以肯定的是,TensorFlow成為最受歡迎的backend,因此從Keras v1.1.0版本開始,TensorFlow成為默認(rèn)的backend。
根據(jù)定義,一旦TensorFlow成為Keras的默認(rèn)backend,TensorFlow和Keras的使用量就會一起增長——如果沒有TensorFlow,就無法擁有Keras,并且如果在系統(tǒng)上安裝了Keras,那么您還將安裝TensorFlow。
同樣,TensorFlow用戶越來越被高級Keras API的簡單性吸引。
TensorFlow v1.10.0中引入了tf.keras子模塊,這是將Keras直接集成在TensorFlow包本身中的第一步。
tf.keras軟件包與您將要通過pip安裝的keras軟件包分開(即pip install keras)。
原始的keras軟件包不包含在tensorflow中以確保兼容性,因此它們都可以有機(jī)地發(fā)展。
但是,現(xiàn)在情況正在發(fā)生變化——當(dāng)Google在2019年6月發(fā)布TensorFlow 2.0時,他們宣布Keras現(xiàn)在是TensorFlow的官方高級API,可以快速,輕松地進(jìn)行模型設(shè)計和訓(xùn)練。
隨著Keras 2.3.0的發(fā)布,Francois聲明:
這是Keras的第一個版本,使keras軟件包與tf.keras同步
這是Keras的最終版本,它將支持多個backend(例如Theano,CNTK等)。
最重要的是,所有深度學(xué)習(xí)從業(yè)人員都應(yīng)將其代碼切換到TensorFlow 2.0和tf.keras軟件包。
原始的keras軟件包仍將收到錯誤修復(fù),但是繼續(xù)前進(jìn),您應(yīng)該使用tf.keras。
如您所知,Keras和TensorFlow之間的歷史悠久,復(fù)雜且交織在一起。
但是,作為Keras用戶,對您來說最重要的收獲是,您應(yīng)該在將來的項目中使用TensorFlow 2.0和tf.keras。
在以后的所有項目中開始使用tf.keras
[2]TensorFlow 2.0中的Keras和tf.keras有什么區(qū)別?在2019年9月17日,Keras v2.3.0正式發(fā)布-在發(fā)行版Francois Chollet(Keras的創(chuàng)建者和首席維護(hù)者)中指出:
Keras v2.3.0是使keras與tf.keras同步的第一個版本, 這將是最后一個支持TensorFlow以外的backend(即Theano,CNTK等)的主要版本。最重要的是,深度學(xué)習(xí)從業(yè)人員應(yīng)該開始轉(zhuǎn)向TensorFlow 2.0和tf.keras軟件包對于大多數(shù)項目,這就像從以下位置更改導(dǎo)入行一樣簡單:
from keras... import ...要使用tensorflow導(dǎo)入:
from tensorflow.keras... import ...如果您使用自定義訓(xùn)練循環(huán)或會話(Session),則必須更新代碼才能使用新的GradientTape功能,但是總的來說,更新代碼相當(dāng)容易。
為了幫助您(自動)將代碼從keras更新為tf.keras,Google發(fā)布了一個名為tf_upgrade_v2腳本,該腳本顧名思義可以分析您的代碼并報告需要更新的行——該腳本甚至可以執(zhí)行為您進(jìn)行升級的過程。
您可以參考此處以了解有關(guān)自動將代碼更新為TensorFlow 2.0的更多信息?https://www.tensorflow.org/guide/upgradeKeras的計算“backend”
[3]Keras支持哪些計算backend?通過tf.keras在TensorFlow中直接使用Keras是什么意思?正如我在本文前面提到的那樣,Keras依賴于計算backend的概念。
計算backend在構(gòu)建模型圖,數(shù)值計算等方面執(zhí)行所有“繁重的工作”。
然后Keras作為abstraction坐在此計算引擎的頂部,使深度學(xué)習(xí)開發(fā)人員/從業(yè)人員更容易實現(xiàn)和訓(xùn)練他們的模型。
最初,Keras支持Theano作為其首選的計算backend——后來又支持其他backend,包括CNTK和mxnet等。
但是,到目前為止,最受歡迎的backend是TensorFlow,最終成為Keras的默認(rèn)計算backend。
隨著越來越多的TensorFlow用戶開始使用Keras的易于使用的高級API,越來越多的TensorFlow開發(fā)人員不得不認(rèn)真考慮將Keras項目納入TensorFlow中名為tf.keras的單獨模塊中。
TensorFlow v1.10是TensorFlow的第一個版本,在tf.keras中包含了一個keras分支。
現(xiàn)在已經(jīng)發(fā)布了TensorFlow 2.0,keras和tf.keras都是同步的,這意味著keras和tf.keras仍然是單獨的項目; 但是,開發(fā)人員應(yīng)該開始使用tf.keras,因為keras軟件包僅支持錯誤修復(fù)。
引用Keras的創(chuàng)建者和維護(hù)者Francois Chollet:
這也是多后端Keras的最后一個主要版本。展望未來,我們建議用戶考慮在TensorFlow 2.0中將其Keras代碼切換為tf.keras。它實現(xiàn)了相同的Keras 2.3.0 API(因此切換應(yīng)該像更改Keras導(dǎo)入語句一樣容易),但是它對TensorFlow用戶具有許多優(yōu)勢,例如支持eager execution, distribution, TPU training, and generally far better integration 在低層TensorFlow和高層概念(如“層”和“模型”)之間。它也得到更好的維護(hù)。如果您同時是Keras和TensorFlow用戶,則應(yīng)考慮將代碼切換到TensorFlow 2.0和tf.keras。
TensorFlow 2.0中Sessions and Eager Execution
[4]Eager execution是一種處理動態(tài)計算圖的Python方式。TensorFlow 2.0支持Eager execution(PyTorch也是如此)。您可以利用TensorFlow 2.0和tf.keras的Eager execution和Sessions使用tf.keras中的Keras API的TensorFlow 1.10+用戶將熟悉創(chuàng)建會話以訓(xùn)練其模型:
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)創(chuàng)建Session對象并要求提前構(gòu)建整個模型圖有點麻煩,因此TensorFlow 2.0引入了Eager Execution的概念,從而將代碼簡化為:
model.fit(X_train, y_train, validation_data=(X_valid, y_valid),epochs=10, batch_size=64)Eager Execution 的好處是不必構(gòu)建整個模型圖。
取而代之的是,將立即評估操作,從而更輕松地開始構(gòu)建模型(以及調(diào)試模型)。
有關(guān)Eager Execution的更多詳細(xì)信息,包括如何與TensorFlow 2.0一起使用,請參閱本文。
https://medium.com/coding-blocks/eager-execution-in-tensorflow-a-more-pythonic-way-of-building-models-e461810618c8而且,如果您想比較“Eager Execution”與“Sessions”及其對訓(xùn)練模型速度的影響,請參閱此頁面。
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如何更好地處理自定義網(wǎng)絡(luò)層或損失函數(shù)?答案在于自動微分和梯度帶如果您是需要實施自定義網(wǎng)絡(luò)層或損失函數(shù)的研究人員,那么您可能不喜歡TensorFlow 1.x(理應(yīng)如此)。
至少可以說,TensorFlow 1.x的自定義實現(xiàn)很笨拙——還有很多不足之處。
隨著TensorFlow 2.0版本的開始變化——現(xiàn)在實現(xiàn)您自己的自定義損失要容易得多。
變得更容易的一種方法是通過自動微分和GradientTape實施。
要利用GradientTape,我們要做的就是實現(xiàn)我們的模型架構(gòu):
# 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')])定義我們的損失函數(shù)和優(yōu)化器:
# Define loss and optimizerloss_func = tf.keras.losses.BinaryCrossentropy()optimizer = tf.keras.optimizers.Adam()創(chuàng)建負(fù)責(zé)執(zhí)行單個批處理更新的函數(shù):
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然后開始訓(xùn)練模型:
# 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為我們在后臺處理差異化處理,使處理自定義損失和網(wǎng)絡(luò)層變得容易得多。
說到自定義層和模型實現(xiàn),一定要參考下一節(jié)。
TensorFlow 2.0中的模型和網(wǎng)絡(luò)層子類化(Model and layer subclassing )
TensorFlow 2.0和tf.keras為我們提供了三種單獨的方法來實現(xiàn)我們自己的自定義模型:
Sequential
Function
Subclassing
Sequential和Function范式都已經(jīng)在Keras中存在很長時間了,但是對于許多深度學(xué)習(xí)從業(yè)者來說,Subclassing功能仍然是未知的。
我將在下周針對這三種方法進(jìn)行專門的教程,但是暫時,讓我們看一下如何使用(1)TensorFlow 2.0,(2)tf基于開創(chuàng)性的LeNet架構(gòu)實現(xiàn)簡單的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的構(gòu)造函數(shù)(即init)定義了模型內(nèi)部的每個單獨層。
然后,call方法將執(zhí)行前向傳遞,使您可以根據(jù)需要自定義前向傳遞。
使用模型子類化(model subclassing )的好處是您的模型:
變得完全可定制(fully-customizable)。
使您能夠?qū)嵤┖屠米约旱淖远x損失實現(xiàn)。
而且,由于您的體系結(jié)構(gòu)繼承了Model類,因此您仍然可以調(diào)用.fit()、. compile()和.evaluate()之類的方法,從而維護(hù)易于使用(且熟悉)的Keras API。
如果您想了解有關(guān)LeNet的更多信息,可以參考下面這篇文章。
https://www.pyimagesearch.com/2016/08/01/lenet-convolutional-neural-network-in-python/TensorFlow 2.0引入了更好的多GPU和分布式訓(xùn)練支持
[6]TensorFlow 2.0是否經(jīng)過多個GPU訓(xùn)練更好?是的TensorFlow 2.0和tf.keras通過其MirroredStrategy提供更好的多GPU和分布式訓(xùn)練。
https://www.tensorflow.org/guide/distributed_training#mirroredstrategy引用TensorFlow 2.0文檔:“ MirroredStrategy支持在一臺機(jī)器上的多個GPU上的同步分布式訓(xùn)練”。
如果要使用多臺計算機(jī)(每臺計算機(jī)可能具有多個GPU),則應(yīng)查看MultiWorkerMirroredStrategy。
https://www.tensorflow.org/guide/distributed_training#multiworkermirroredstrategy或者,如果您使用Google的云服務(wù)器進(jìn)行訓(xùn)練,請查看TPUStrategy。
https://www.tensorflow.org/guide/distributed_training#tpustrategy不過,現(xiàn)在,假設(shè)您位于一臺具有多個GPU的機(jī)器上,并且想要確保所有GPU都用于訓(xùn)練。
您可以先創(chuàng)建MirroredStrategy來完成此操作:
strategy = tf.distribute.MirroredStrategy()print ('Number of devices: {}'.format(strategy.num_replicas_in_sync))然后,您需要聲明您的模型架構(gòu),并在 strategy 范圍內(nèi)對其進(jìn)行編譯:
# 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'])從那里,您可以調(diào)用.fit訓(xùn)練模型:
# Train the modelmodel.fit(X, y, epochs=5)如果您的機(jī)器具有多個GPU,TensorFlow將為您處理多GPU訓(xùn)練。
TensorFlow 2.0是一個生態(tài)系統(tǒng),包括TF 2.0,TF Lite,TFX,量化(quantization)和部署(deployment)
[7] TensorFlow 2.0生態(tài)系統(tǒng)中有哪些新功能?我應(yīng)該單獨使用Keras還是應(yīng)該使用tf.keras?TensorFlow 2.0不僅僅是一個計算引擎和一個用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)庫,它還具有更多功能。
借助TensorFlow Lite(TF Lite),我們可以訓(xùn)練,優(yōu)化和量化旨在在資源受限的設(shè)備上運行的模型,例如智能手機(jī)和其他嵌入式設(shè)備(例如Raspberry Pi,Google Coral等)。
https://www.tensorflow.org/lite/或者,如果您需要將模型部署到生產(chǎn)環(huán)境,則可以使用TensorFlow Extended(TFX),這是用于模型部署的端到端平臺。
研究和實驗完成后,您可以利用TFX為生產(chǎn)準(zhǔn)備模型,并使用Google的生態(tài)系統(tǒng)擴(kuò)展模型。
借助TensorFlow 2.0,我們真正開始看到在研究,實驗,模型準(zhǔn)備/量化和部署到生產(chǎn)之間更好,更高效的橋梁。
我對TensorFlow 2.0的發(fā)布及其對深度學(xué)習(xí)社區(qū)的影響感到非常興奮。
Credits
本文中的所有代碼示例均來自TensorFlow 2.0的官方示例。有關(guān)更多詳細(xì)信息,請確保參考Francois Chollet提供的完整代碼示例。
https://www.tensorflow.org/tutorials
https://colab.research.google.com/drive/17u-pRZJnKN0gO5XZmq8n5A2bKGrfKEUg
此外,一定要查閱Sayak Paul的TensorFlow 2.0的十個重要更新,這有助于啟發(fā)今天的博客文章。
https://www.datacamp.com/community/tutorials/ten-important-updates-tensorflow總結(jié)
在本教程中,您了解了Keras,tf.keras和TensorFlow 2.0。
首先重要的一點是,使用keras軟件包的深度學(xué)習(xí)從業(yè)人員應(yīng)該開始在TensorFlow 2.0中使用tf.keras。
您不僅會享受TensorFlow 2.0的更快的速度和優(yōu)化,而且還將獲得新的功能更新-keras軟件包的最新版本(v2.3.0)將成為支持多個后端和功能更新的最新版本。展望未來,keras軟件包將僅收到錯誤修復(fù)。
您應(yīng)該在未來的項目中認(rèn)真考慮遷移到tf.keras和TensorFlow 2.0。
第二個要點是TensorFlow 2.0不僅僅是GPU加速的深度學(xué)習(xí)庫。
您不僅可以使用TensorFlow 2.0和tf.keras訓(xùn)練自己的模型,而且現(xiàn)在可以:
采取這些模型,并使用TensorFlow Lite(TF Lite)為移動/嵌入式部署做好準(zhǔn)備。
使用TensorFlow Extended(TF Extended)將模型部署到生產(chǎn)中。
從我的角度來看,我已經(jīng)開始將原始的keras代碼移植到tf.keras。我建議您開始做同樣的事情。
英文原文鏈接:
https://www.pyimagesearch.com/2019/10/21/keras-vs-tf-keras-whats-the-difference-in-tensorflow-2-0/
備注:公眾號菜單包含了整理了一本AI小抄,非常適合在通勤路上用學(xué)習(xí)。
往期精彩回顧那些年做的學(xué)術(shù)公益-你不是一個人在戰(zhàn)斗適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(第一部分)備注:加入本站微信群或者qq群,請回復(fù)“加群”加入知識星球(4500+用戶,ID:92416895),請回復(fù)“知識星球”
喜歡文章,點個在看
總結(jié)
以上是生活随笔為你收集整理的Keras vs tf.keras: 在TensorFlow 2.0中有什么区别?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 找对象困难?不如让AI算法来帮你
- 下一篇: 厉害了!Python+matplotli