
Keras是目前深度學(xué)習(xí)研究領(lǐng)域非常流行的框架,相比于TensorFlow,Keras是一種更高層次的深度學(xué)習(xí)API。
Keras使用Python編寫而成,包含了大量模塊化的接口,有很多常用模型僅需幾行代碼即可完成,大大提高了深度學(xué)習(xí)的科研效率。它是一個(gè)高級(jí)接口,后端可支持TensorFlow、Theano、CNTK等多種深度學(xué)習(xí)基礎(chǔ)框架,默認(rèn)為TensorFlow,其他需要單獨(dú)設(shè)置。
目前,谷歌已經(jīng)將Keras庫(kù)移植到TensorFlow中,也讓Keras成了TensorFlow中的高級(jí)API模塊。
Keras具備了三個(gè)核心特點(diǎn):
-
-
支持深度學(xué)習(xí)中最流行的卷積神經(jīng)網(wǎng)絡(luò)與循環(huán)神經(jīng)網(wǎng)絡(luò),以及它們兩者的組合。
-
可以在CPU與GPU上無(wú)縫運(yùn)行。
Keras的口號(hào)是“為人類服務(wù)的深度學(xué)習(xí)”,在整體的設(shè)計(jì)上堅(jiān)持對(duì)開(kāi)發(fā)者友好,在API的設(shè)計(jì)上簡(jiǎn)單可讀,將用戶體驗(yàn)放在首位,希望研發(fā)人員可以以盡可能低的學(xué)習(xí)成本來(lái)投入深度學(xué)習(xí)的開(kāi)發(fā)中。
Keras的API設(shè)計(jì)是模塊化的,用戶可以基于自己設(shè)想的模型對(duì)已有模塊進(jìn)行組裝,其中如神經(jīng)網(wǎng)絡(luò)層、損失函數(shù)、優(yōu)化器、激活函數(shù)等都可以作為模塊組合成新的模型。與此同時(shí),Keras的擴(kuò)展性非常強(qiáng)大,用戶可以輕松創(chuàng)建新模塊用于科學(xué)研究。
目前最簡(jiǎn)單的引入Keras的方法就是直接使用最新版本的TensorFlow,可以通過(guò)以下引入方式在代碼中使用Keras。
from tensorflow import keras
此外,Keras具有一個(gè)非?;钴S的開(kāi)發(fā)者社區(qū),每天都會(huì)有大量的開(kāi)源代碼貢獻(xiàn)者為Keras提供各種各樣的功能。其中Keras-contrib是一個(gè)官方的Keras社區(qū)擴(kuò)展版本,包含了很多社區(qū)開(kāi)發(fā)者提供的新功能,為Keras的用戶提供了更多選擇。
Keras-contrib的新功能通過(guò)審核后都會(huì)整合到Keras核心項(xiàng)目中,如果現(xiàn)在就想在項(xiàng)目中使用,需要單獨(dú)安裝,同樣,可以使用pip工具直接安裝。
$ sudo pip install git+https://www.github.com/keras-team/keras-contrib.git
隨著Karas加入TensorFlow,為了更好地進(jìn)行代碼上的整合,Keras-contrib項(xiàng)目被整合進(jìn)了TensorFlow Addons。
TensorFlow Addons是一個(gè)針對(duì)TensorFlow核心庫(kù)功能的補(bǔ)充,集成了社區(qū)最新的一系列方法。由于AI領(lǐng)域發(fā)展的速度快,一些最新的算法無(wú)法立刻移植到TensorFlow核心庫(kù)中,所以會(huì)優(yōu)先在TensorFlow Addons中進(jìn)行發(fā)布。
可以使用pip的方式方便地安裝TensorFlow Addons,從而使用一些高級(jí)的API接口。
$ pip install tensorflow-addons
Keras包含兩種模型類型,第一種是序列模型,第二種是函數(shù)式模型。其中后者屬于Keras的進(jìn)階型模型結(jié)構(gòu),適用于多入多出、有向無(wú)環(huán)圖或具備共享層的模型,具體可參考Keras官方文檔。本節(jié)中主要通過(guò)介紹序列模型來(lái)帶讀者學(xué)習(xí)Keras的使用方法。
所謂序列模型是指多個(gè)網(wǎng)絡(luò)層線性堆疊的模型,結(jié)構(gòu)如下列代碼所示,該序列模型包含了一個(gè)784×32的全連接層、ReLU激活函數(shù)、32×10的全連接層以及softmax激活函數(shù)。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
也可以使用add() 方法進(jìn)行序列模型中網(wǎng)絡(luò)層的添加。
model = Sequential()
model.add(Dense(32,input_dim=784))
model.add(Activation('relu'))
下面我們來(lái)看一個(gè)用Keras實(shí)現(xiàn)的神經(jīng)網(wǎng)絡(luò)二分類示例,網(wǎng)絡(luò)結(jié)構(gòu)非常簡(jiǎn)單,由兩個(gè)全連接層構(gòu)成。示例中包含了網(wǎng)絡(luò)模型的搭建、模型的編譯以及訓(xùn)練,讀者可以在自己的設(shè)備上嘗試運(yùn)行此代碼以熟悉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)
下面我們根據(jù)Keras官網(wǎng)的示例來(lái)嘗試搭建一個(gè)類似VGG網(wǎng)絡(luò)的卷積神經(jīng)網(wǎng)絡(luò)模型。首先引入需要使用的模塊,其中包括Keras庫(kù)中的全連接層、卷積層等。
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
為了實(shí)現(xiàn)模型,我們需要先準(zhǔn)備一些訓(xùn)練和測(cè)試數(shù)據(jù),這里使用隨機(jī)方法進(jìn)行數(shù)據(jù)的準(zhǔn)備。
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的結(jié)構(gòu)來(lái)搭建整個(gè)網(wǎng)絡(luò),包括疊加卷積層、池化層、Dropout層、Max Pooling層、全連接網(wǎng)絡(luò)層等。
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'))
最后我們進(jìn)行模型的優(yōu)化設(shè)置以及對(duì)模型進(jìn)行編譯,并可以在訓(xùn)練數(shù)據(jù)上進(jìn)行學(xué)習(xí)。
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 的序列模型實(shí)現(xiàn)基于LSTM 的循環(huán)神經(jīng)網(wǎng)絡(luò)模型。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Embedding,LSTM
model = Sequential()
model.add(Embedding(20000,128))
model.add(LSTM(128,dropout=0.2,recurrent_dropout=0.2))
model.add(Dense(1,activation='sigmoid'))
下面則是對(duì)于該循環(huán)神經(jīng)網(wǎng)絡(luò)模型的編譯與訓(xùn)練,同時(shí)最終評(píng)估了訓(xùn)練模型的效果。
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文件夾路徑下。
當(dāng)在業(yè)務(wù)中需要使用對(duì)應(yīng)模型時(shí),只需要使用加載模型的方法從model 路徑中進(jìn)行模型的加載即可。
from tensorflow.keras.models import load_model
my_model = load_model('./model')
通過(guò)這幾個(gè)示例我們會(huì)發(fā)現(xiàn),使用Keras 來(lái)實(shí)現(xiàn)那些復(fù)雜的深度學(xué)習(xí)網(wǎng)絡(luò)像是搭建積木一樣,把一些非常復(fù)雜的工作簡(jiǎn)單化了。在下一節(jié)中,會(huì)通過(guò)一個(gè)簡(jiǎn)明的案例帶領(lǐng)大家了解如何使用Keras解決實(shí)際的應(yīng)用問(wèn)題。
本小節(jié)中我們通過(guò)學(xué)習(xí)Keras官方的一個(gè)實(shí)例來(lái)熟悉一下Keras的使用方法。
https://github.com/keras-team/keras/blob/master/examples/imdb_lstm.py
情感分析是自然語(yǔ)言處理領(lǐng)域的研究熱點(diǎn),也是一項(xiàng)非常實(shí)用的技術(shù),可以利用這項(xiàng)技術(shù)來(lái)分析用戶在互聯(lián)網(wǎng)上的觀點(diǎn)和態(tài)度,同時(shí)也可以分析企業(yè)或商品在互聯(lián)網(wǎng)上的口碑。
在深度學(xué)習(xí)中,循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)是處理像文本這樣的序列模型的最好方式,但傳統(tǒng)的RNN存在的問(wèn)題是,當(dāng)序列變長(zhǎng)后,RNN無(wú)法記住之前的重要信息,并且會(huì)存在梯度消失的問(wèn)題。為了解決上述問(wèn)題,研究者提出了一種長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM),這也是目前業(yè)內(nèi)處理文本序列非常流行的一種模型(見(jiàn)圖2-14)。

▲圖2-14 LSTM網(wǎng)絡(luò)結(jié)構(gòu)示意圖
Keras官方已經(jīng)為大家準(zhǔn)備好了LSTM模型的API,并且提供了IMDB電影評(píng)論數(shù)據(jù)集,其中包含了評(píng)論內(nèi)容和打分。下面讓我們來(lái)看如何使用Keras來(lái)解決情感分析的問(wèn)題。首先引入所有需要的模塊。
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
準(zhǔn)備好數(shù)據(jù),選擇最常用的20000個(gè)詞作為特征數(shù)據(jù),并將數(shù)據(jù)分為訓(xùn)練集和測(cè)試集。對(duì)于文本數(shù)據(jù),這里需要進(jìn)行長(zhǎng)度統(tǒng)一,設(shè)置最大長(zhǎng)度為80個(gè)詞,如果超過(guò)則截?cái)啵蛔銊t補(bǔ)零。
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)
數(shù)據(jù)處理完成后就可以搭建模型了。首先使用嵌入層作為模型的第一層,將輸入的20000維的文字向量轉(zhuǎn)換為128維的稠密向量。接著就是利用LSTM模型進(jìn)行文本序列的深度學(xué)習(xí)訓(xùn)練。最終使用全連接層加上Sigmoid激活函數(shù)作為最終的判斷輸出。搭建完畢后還需要為模型設(shè)置編譯的損失函數(shù)和優(yōu)化器。
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'])
然后就可以訓(xùn)練和評(píng)估情感分析的模型了。在Keras幫助下,通過(guò)簡(jiǎn)單的幾步就可以完成基于深度學(xué)習(xí)的文本情感分析的任務(wù)。
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框架訓(xùn)練完模型以后,可以通過(guò)Keras的save方法將模型保存下來(lái)。為了能夠更好地讓機(jī)器學(xué)習(xí)投入真實(shí)世界的應(yīng)用中去,我們可以為模型封裝一個(gè)外部的應(yīng)用程序。在互聯(lián)網(wǎng)時(shí)代,使用網(wǎng)絡(luò)接入AI模型是對(duì)于用戶來(lái)說(shuō)成本最低的方式。
為此我們可以搭建一個(gè)基于Web的AI應(yīng)用程序,將模型投入生產(chǎn)環(huán)境中為互聯(lián)網(wǎng)用戶提供即時(shí)的網(wǎng)頁(yè)服務(wù)。
在Python中常用的Web編程框架是Flask,它是一個(gè)非常流行的Python服務(wù)端程序框架,相比于在Python領(lǐng)域非常流行的Django,它的特點(diǎn)在于更為精簡(jiǎn),去除了一些封裝好的服務(wù),只保留了最基本的服務(wù)器程序,而其余的擴(kuò)展可以通過(guò)用戶自己添加第三方包實(shí)現(xiàn)。
關(guān)于作者:史丹青,語(yǔ)憶科技聯(lián)合創(chuàng)始人兼技術(shù)負(fù)責(zé)人,畢業(yè)于同濟(jì)大學(xué)電子信息工程系。擁有多年時(shí)間的AI領(lǐng)域創(chuàng)業(yè)與實(shí)戰(zhàn)經(jīng)驗(yàn),具備深度學(xué)習(xí)、自然語(yǔ)言處理以及數(shù)據(jù)可視化等相關(guān)知識(shí)與技能。是AI技術(shù)的愛(ài)好者,并擁抱一切新興科技,始終堅(jiān)信技術(shù)分享和開(kāi)源精神的力量。
本文摘編自《生成對(duì)抗網(wǎng)絡(luò)入門指南》(第2版),經(jīng)出版方授權(quán)發(fā)布。

延伸閱讀《生成對(duì)抗網(wǎng)絡(luò)入門指南》(第2版)
點(diǎn)擊上圖了解及購(gòu)買
轉(zhuǎn)載請(qǐng)聯(lián)系微信:DoctorData
推薦語(yǔ):揭秘AI如何生成逼真人臉圖像,追蹤GAN前沿技術(shù)更新。
在公眾號(hào)對(duì)話框輸入以下關(guān)鍵詞
讀書(shū) | 書(shū)單 | 干貨 | 講明白 | 神操作 | 手把手
大數(shù)據(jù) | 云計(jì)算 | 數(shù)據(jù)庫(kù) | Python | 爬蟲(chóng) | 可視化
AI | 人工智能 | 機(jī)器學(xué)習(xí) | 深度學(xué)習(xí) | NLP
5G | 中臺(tái) | 用戶畫(huà)像 | 數(shù)學(xué) | 算法 | 數(shù)字孿生
據(jù)統(tǒng)計(jì),99%的大咖都關(guān)注了這個(gè)公眾號(hào)