Keras入门必读教程:手把手从安装到解决实际问题
導讀:Keras是目前深度學習研究領域非常流行的框架。
作者:史丹青
來源:大數據DT(ID:hzdashuju)
01?Keras簡介與安裝
Keras是目前深度學習研究領域非常流行的框架,相比于TensorFlow,Keras是一種更高層次的深度學習API。
Keras使用Python編寫而成,包含了大量模塊化的接口,有很多常用模型僅需幾行代碼即可完成,大大提高了深度學習的科研效率。它是一個高級接口,后端可支持TensorFlow、Theano、CNTK等多種深度學習基礎框架,默認為TensorFlow,其他需要單獨設置。
目前,谷歌已經將Keras庫移植到TensorFlow中,也讓Keras成了TensorFlow中的高級API模塊。
Keras具備了三個核心特點:
允許研究人員快速搭建原型設計。
支持深度學習中最流行的卷積神經網絡與循環神經網絡,以及它們兩者的組合。
可以在CPU與GPU上無縫運行。
Keras的口號是“為人類服務的深度學習”,在整體的設計上堅持對開發者友好,在API的設計上簡單可讀,將用戶體驗放在首位,希望研發人員可以以盡可能低的學習成本來投入深度學習的開發中。
Keras的API設計是模塊化的,用戶可以基于自己設想的模型對已有模塊進行組裝,其中如神經網絡層、損失函數、優化器、激活函數等都可以作為模塊組合成新的模型。與此同時,Keras的擴展性非常強大,用戶可以輕松創建新模塊用于科學研究。
目前最簡單的引入Keras的方法就是直接使用最新版本的TensorFlow,可以通過以下引入方式在代碼中使用Keras。
from?tensorflow?import?keras此外,Keras具有一個非常活躍的開發者社區,每天都會有大量的開源代碼貢獻者為Keras提供各種各樣的功能。其中Keras-contrib是一個官方的Keras社區擴展版本,包含了很多社區開發者提供的新功能,為Keras的用戶提供了更多選擇。
Keras-contrib的新功能通過審核后都會整合到Keras核心項目中,如果現在就想在項目中使用,需要單獨安裝,同樣,可以使用pip工具直接安裝。
$?sudo?pip?install?git+https://www.github.com/keras-team/keras-contrib.git隨著Karas加入TensorFlow,為了更好地進行代碼上的整合,Keras-contrib項目被整合進了TensorFlow Addons。
TensorFlow Addons是一個針對TensorFlow核心庫功能的補充,集成了社區最新的一系列方法。由于AI領域發展的速度快,一些最新的算法無法立刻移植到TensorFlow核心庫中,所以會優先在TensorFlow Addons中進行發布。
可以使用pip的方式方便地安裝TensorFlow Addons,從而使用一些高級的API接口。
$?pip?install?tensorflow-addons02 Keras使用入門
Keras包含兩種模型類型,第一種是序列模型,第二種是函數式模型。其中后者屬于Keras的進階型模型結構,適用于多入多出、有向無環圖或具備共享層的模型,具體可參考Keras官方文檔。本節中主要通過介紹序列模型來帶讀者學習Keras的使用方法。
所謂序列模型是指多個網絡層線性堆疊的模型,結構如下列代碼所示,該序列模型包含了一個784×32的全連接層、ReLU激活函數、32×10的全連接層以及softmax激活函數。
from?tensorflow.keras.models?import?Sequential from?tensorflow.keras.layers?import?Dense,?Activationmodel?=?Sequential([ Dense(32,?input_shape=(784,)), Activation('relu'), Dense(10), Activation('softmax'), ])也可以使用add() 方法進行序列模型中網絡層的添加。
model?=?Sequential() model.add(Dense(32,input_dim=784)) model.add(Activation('relu'))下面我們來看一個用Keras實現的神經網絡二分類示例,網絡結構非常簡單,由兩個全連接層構成。示例中包含了網絡模型的搭建、模型的編譯以及訓練,讀者可以在自己的設備上嘗試運行此代碼以熟悉Keras的使用。
import?numpy?as?np from?tensorflow.keras.models?import?Sequential? from?tensorflow.keras.layers?import?Dense data?=?np.random.random((1000,100)) labels?=?np.random.randint(2,size=(1000,1)) model?=?Sequential() model.add(Dense(32,activation='relu',?input_dim=100)) model.add(Dense(1,?activation='sigmoid')) model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy']) model.fit(data,labels,epochs=10,batch_size=32) predictions?=?model.predict(data)下面我們根據Keras官網的示例來嘗試搭建一個類似VGG網絡的卷積神經網絡模型。首先引入需要使用的模塊,其中包括Keras庫中的全連接層、卷積層等。
import?numpy?as?np from?tensorflow?import?keras from?tensorflow.keras.models?import?Sequential from?tensorflow.keras.layers?import?Dense,?Dropout,?Flatten from?tensorflow.keras.layers?import?Conv2D,?MaxPooling2D from?tensorflow.keras.optimizers?import?SGD為了實現模型,我們需要先準備一些訓練和測試數據,這里使用隨機方法進行數據的準備。
x_train?=?np.random.random((100,?100,?100,?3)) y_train?=?keras.utils.to_categorical(np.random.randint(10,?size=(100,?1)), num_classes=10) x_test?=?np.random.random((20,?100,?100,?3)) y_test?=?keras.utils.to_categorical(np.random.randint(10,?size=(20,?1)), num_classes=10)整體上可以按照VGG的結構來搭建整個網絡,包括疊加卷積層、池化層、Dropout層、Max Pooling層、全連接網絡層等。
model?=?Sequential()model.add(Conv2D(32,?(3,?3),?activation='relu',?input_shape=(100,?100,?3))) model.add(Conv2D(32,?(3,?3),?activation='relu')) model.add(MaxPooling2D(pool_size=(2,?2))) model.add(Dropout(0.25))model.add(Conv2D(64,?(3,?3),?activation='relu')) model.add(Conv2D(64,?(3,?3),?activation='relu')) model.add(MaxPooling2D(pool_size=(2,?2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(256,?activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10,?activation='softmax'))最后我們進行模型的優化設置以及對模型進行編譯,并可以在訓練數據上進行學習。
sgd?=?SGD(lr=0.01,?decay=1e-6,?momentum=0.9,?nesterov=True) model.compile(loss='categorical_crossentropy',?optimizer=sgd) model.fit(x_train,?y_train,?batch_size=32,?epochs=10) score?=?model.evaluate(x_test,?y_test,?batch_size=32)同樣地,我們也可以使用Keras 的序列模型實現基于LSTM 的循環神經網絡模型。
from?tensorflow.keras.models?import?Sequential? from?tensorflow.keras.layers?import?Dense,Embedding,LSTMmodel?=?Sequential() model.add(Embedding(20000,128)) model.add(LSTM(128,dropout=0.2,recurrent_dropout=0.2)) model.add(Dense(1,activation='sigmoid'))下面則是對于該循環神經網絡模型的編譯與訓練,同時最終評估了訓練模型的效果。
model.compile(loss='binary_crossentropy',?optimizer='adam',?metrics= ['accuracy']) model.fit(x_train,?y_train,?batch_size=32,?epochs=15,?verbose=1,?validation_data= (x_test,y_test)) score?=?model.evaluate(x_test,?y_test,?batch_size=32)最終我們可以將模型保存到本地的model文件夾路徑下。
model.save('./model')當在業務中需要使用對應模型時,只需要使用加載模型的方法從model 路徑中進行模型的加載即可。
from?tensorflow.keras.models?import?load_model my_model?=?load_model('./model')通過這幾個示例我們會發現,使用Keras 來實現那些復雜的深度學習網絡像是搭建積木一樣,把一些非常復雜的工作簡單化了。在下一節中,會通過一個簡明的案例帶領大家了解如何使用Keras解決實際的應用問題。
03 Keras實例:文本情感分析
本小節中我們通過學習Keras官方的一個實例來熟悉一下Keras的使用方法。
參考鏈接:
https://github.com/keras-team/keras/blob/master/examples/imdb_lstm.py
情感分析是自然語言處理領域的研究熱點,也是一項非常實用的技術,可以利用這項技術來分析用戶在互聯網上的觀點和態度,同時也可以分析企業或商品在互聯網上的口碑。
在深度學習中,循環神經網絡(RNN)是處理像文本這樣的序列模型的最好方式,但傳統的RNN存在的問題是,當序列變長后,RNN無法記住之前的重要信息,并且會存在梯度消失的問題。為了解決上述問題,研究者提出了一種長短期記憶網絡(LSTM),這也是目前業內處理文本序列非常流行的一種模型(見圖2-14)。
▲圖2-14 LSTM網絡結構示意圖
Keras官方已經為大家準備好了LSTM模型的API,并且提供了IMDB電影評論數據集,其中包含了評論內容和打分。下面讓我們來看如何使用Keras來解決情感分析的問題。首先引入所有需要的模塊。
from?__future__?import?print_function from?tensorflow.keras.preprocessing?import?sequence from?tensorflow.keras.models?import?Sequential from?tensorflow.keras.layers?import?Dense,?Embedding,?LSTM from?tensorflow.keras.datasets?import?imdb準備好數據,選擇最常用的20000個詞作為特征數據,并將數據分為訓練集和測試集。對于文本數據,這里需要進行長度統一,設置最大長度為80個詞,如果超過則截斷,不足則補零。
max_features?=?20000 maxlen?=?80 batch_size?=?32(x_train,?y_train),?(x_test,?y_test)?=?imdb.load_data(num_words=max_features) x_train?=?sequence.pad_sequences(x_train,?maxlen=maxlen) x_test?=?sequence.pad_sequences(x_test,?maxlen=maxlen)數據處理完成后就可以搭建模型了。首先使用嵌入層作為模型的第一層,將輸入的20000維的文字向量轉換為128維的稠密向量。接著就是利用LSTM模型進行文本序列的深度學習訓練。最終使用全連接層加上Sigmoid激活函數作為最終的判斷輸出。搭建完畢后還需要為模型設置編譯的損失函數和優化器。
model?=?Sequential() model.add(Embedding(max_features,?128)) model.add(LSTM(128,?dropout=0.2,?recurrent_dropout=0.2)) model.add(Dense(1,?activation='sigmoid'))model.compile(loss='binary_crossentropy',optimizer='adam', metrics=['accuracy'])然后就可以訓練和評估情感分析的模型了。在Keras幫助下,通過簡單的幾步就可以完成基于深度學習的文本情感分析的任務。
model.fit(x_train,?y_train, batch_size=batch_size, epochs=15, validation_data=(x_test,?y_test)) score,?acc?=?model.evaluate(x_test,?y_test, batch_size=batch_size) print('Test?score:',?score) print('Test?accuracy:',?acc)在使用Keras框架訓練完模型以后,可以通過Keras的save方法將模型保存下來。為了能夠更好地讓機器學習投入真實世界的應用中去,我們可以為模型封裝一個外部的應用程序。在互聯網時代,使用網絡接入AI模型是對于用戶來說成本最低的方式。
為此我們可以搭建一個基于Web的AI應用程序,將模型投入生產環境中為互聯網用戶提供即時的網頁服務。
在Python中常用的Web編程框架是Flask,它是一個非常流行的Python服務端程序框架,相比于在Python領域非常流行的Django,它的特點在于更為精簡,去除了一些封裝好的服務,只保留了最基本的服務器程序,而其余的擴展可以通過用戶自己添加第三方包實現。?
關于作者:史丹青,語憶科技聯合創始人兼技術負責人,畢業于同濟大學電子信息工程系。擁有多年時間的AI領域創業與實戰經驗,具備深度學習、自然語言處理以及數據可視化等相關知識與技能。是AI技術的愛好者,并擁抱一切新興科技,始終堅信技術分享和開源精神的力量。
本文摘編自《生成對抗網絡入門指南》(第2版),經出版方授權發布。
延伸閱讀《生成對抗網絡入門指南》(第2版)
點擊上圖了解及購買
轉載請聯系微信:DoctorData
推薦語:揭秘AI如何生成逼真人臉圖像,追蹤GAN前沿技術更新。
劃重點👇
干貨直達👇
安全工程師最詳細學習和職業規劃路線(書籍推薦和導圖下載)
元宇宙火了!終于有人把虛擬現實(AR/VR/MR)講明白了
什么是物聯網?有哪些應用?終于有人講明白了
終于有人把云原生講明白了
更多精彩👇
在公眾號對話框輸入以下關鍵詞
查看更多優質內容!
讀書?|?書單?|?干貨?|?講明白?|?神操作?|?手把手
大數據?|?云計算?|?數據庫?|?Python?|?爬蟲?|?可視化
AI?|?人工智能?|?機器學習?|?深度學習?|?NLP
5G?|?中臺?|?用戶畫像?|?數學?|?算法?|?數字孿生
據統計,99%的大咖都關注了這個公眾號
👇
總結
以上是生活随笔為你收集整理的Keras入门必读教程:手把手从安装到解决实际问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于MFC实现圆角矩形窗口
- 下一篇: 盘点云计算领域不可不读的9本书