版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Keras深度學(xué)習(xí)實(shí)戰(zhàn)基于TensorFlow和Theano創(chuàng)建神經(jīng)網(wǎng)絡(luò)目錄TOC\h\h第1章神經(jīng)網(wǎng)絡(luò)基礎(chǔ)\h1.1感知機(jī)\h1.2多層感知機(jī)——第一個(gè)神經(jīng)網(wǎng)絡(luò)的示例\h1.3實(shí)例——手寫數(shù)字識(shí)別\h1.4一種實(shí)用的反向傳播概述\h1.5走向深度學(xué)習(xí)之路\h1.6小結(jié)\h第2章Keras安裝和API\h2.1安裝Keras\h2.2配置Keras\h2.3在Docker上安裝Keras\h2.4在谷歌CloudML上安裝Keras\h2.5在亞馬遜AWS上安裝Keras\h2.6在微軟Azure上安裝Keras\h2.7KerasAPI\h2.8自定義訓(xùn)練過(guò)程的回調(diào)函數(shù)\h2.9小結(jié)\h第3章深度學(xué)習(xí)之卷積網(wǎng)絡(luò)\h3.1深度卷積神經(jīng)網(wǎng)絡(luò)——DCNN\h3.2DCNN示例——LeNet\h3.3用深度學(xué)習(xí)網(wǎng)絡(luò)識(shí)別CIFAR-10圖像\h3.4用于大型圖片識(shí)別的極深度卷積網(wǎng)絡(luò)\h3.5小結(jié)\h第4章生成對(duì)抗網(wǎng)絡(luò)和WaveNet\h4.1什么是生成對(duì)抗網(wǎng)絡(luò)\h4.2深度卷積生成對(duì)抗網(wǎng)絡(luò)\h4.3用Kerasadversarial生成MNIST數(shù)據(jù)\h4.4用Kerasadversarial生成CIFAR數(shù)據(jù)\h4.5WaveNet——一個(gè)學(xué)習(xí)如何產(chǎn)生音頻的生成模型\h4.6小結(jié)\h第5章詞嵌入\h5.1分布式表示\h5.2word2vec\h5.3探索GloVe\h5.4使用預(yù)訓(xùn)練好的詞向量\h5.5小結(jié)\h第6章循環(huán)神經(jīng)網(wǎng)絡(luò)——RNN\h6.1SimpleRNN單元\h6.2RNN拓?fù)浣Y(jié)構(gòu)\h6.3梯度消失和梯度爆炸\h6.4長(zhǎng)短期記憶網(wǎng)絡(luò)——LSTM\h6.5門控循環(huán)單元——GRU\h6.6雙向RNN\h6.7有狀態(tài)RNN\h6.8其他RNN變體\h6.9小結(jié)\h第7章其他深度學(xué)習(xí)模型\h7.1Keras函數(shù)API\h7.2回歸網(wǎng)絡(luò)\h7.3無(wú)監(jiān)督學(xué)習(xí)——自動(dòng)編碼器\h7.4構(gòu)造深度網(wǎng)絡(luò)\h7.5自定義Keras\h7.6生成模型\h7.7小結(jié)\h第8章游戲中的AI\h8.1強(qiáng)化學(xué)習(xí)\h8.2示例——用Keras深度Q網(wǎng)絡(luò)實(shí)現(xiàn)捕捉游戲\h8.3未來(lái)之路\h8.4小結(jié)\h第9章結(jié)束語(yǔ)\h9.1Keras2.0——新特性第1章神經(jīng)網(wǎng)絡(luò)基礎(chǔ)人工神經(jīng)網(wǎng)絡(luò)表示一類機(jī)器學(xué)習(xí)的模型,最初是受到了哺乳動(dòng)物中央神經(jīng)系統(tǒng)研究的啟發(fā)。網(wǎng)絡(luò)由相互連接的分層組織的神經(jīng)元組成,這些神經(jīng)元在達(dá)到一定條件時(shí)就會(huì)互相交換信息(專業(yè)術(shù)語(yǔ)是激發(fā)(fire))。最初的研究開始于20世紀(jì)50年代后期,當(dāng)時(shí)引入了感知機(jī)(Perceptron)模型(更多信息請(qǐng)參考文章《ThePerceptron:AProbabilisticModelforInformationStorageandOrganizationintheBrain》,作者F.Rosenblatt,PsychologicalReview,vol.65,pp.386~408,1958)。感知機(jī)是一個(gè)可以實(shí)現(xiàn)簡(jiǎn)單操作的兩層網(wǎng)絡(luò),并在20世紀(jì)60年代后期引入反向傳播算法(backpropagationalgorithm)后得到進(jìn)一步擴(kuò)展,用于高效的多層網(wǎng)絡(luò)的訓(xùn)練(據(jù)以下文章《BackpropagationthroughTime:WhatItDoesandHowtoDoIt》,作者P.J.Werbos,ProceedingsoftheIEEE,vol.78,pp.1550~1560,1990;《AFastLearningAlgorithmforDeepBeliefNets》,作者G.E.Hinton,S.Osindero,Y.W.Teh,NeuralComputing,vol.18,pp.1527~1554,2006)。有些研究認(rèn)為這些技術(shù)起源可以追溯到比通常引述的更早的時(shí)候(更多信息,請(qǐng)參考文章《DeepLearninginNeuralNetworks:AnOverview》,作者J.Schmidhuber,NeuralNetworks,vol.61,pp.85~117,2015)。直到20世紀(jì)80年代,人們才對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行了大量的學(xué)術(shù)研究,那時(shí)其他更簡(jiǎn)單的方法正變得更加有用。然后,由于G.Hinton提出的快速學(xué)習(xí)算法(更多信息,請(qǐng)參考文章《TheRootsofBackpropagation:FromOrderedDerivativestoNeuralNetworksandPoliticalForecasting》,作者S.Leven,NeuralNetworks,vol.9,1996;《LearningRepresentationsbyBackpropagatingErrors》,作者D.E.Rumelhart,G.E.Hinton,R.J.Williams,Nature,vol.323,1986),以及2011年前后引入GPU后使大量數(shù)值計(jì)算成為可能,開始再度出現(xiàn)了神經(jīng)網(wǎng)絡(luò)研究的熱潮。這些進(jìn)展打開了現(xiàn)代深度學(xué)習(xí)的大門。深度學(xué)習(xí)是以一定數(shù)量網(wǎng)絡(luò)層的神經(jīng)元為標(biāo)志的神經(jīng)網(wǎng)絡(luò),它可以基于漸進(jìn)的層級(jí)抽象學(xué)習(xí)相當(dāng)復(fù)雜的模型。幾年前,3~5層的網(wǎng)絡(luò)就是深度的,而現(xiàn)在的深度網(wǎng)絡(luò)已經(jīng)是指100~200層。這種漸進(jìn)式抽象的學(xué)習(xí)模型,模仿了歷經(jīng)幾百萬(wàn)年演化的人類大腦的視覺模型。人類大腦視覺系統(tǒng)由不同的層組成。我們?nèi)搜坳P(guān)聯(lián)的大腦區(qū)域叫作初級(jí)視覺皮層V1,它位于大腦后下方。視覺皮層為多數(shù)哺乳動(dòng)物所共有,它承擔(dān)著感知和區(qū)分視覺定位、空間頻率以及色彩等方面的基本屬性和微小變化的角色。據(jù)估計(jì),初級(jí)視覺層包含了1億4000萬(wàn)個(gè)神經(jīng)元,以及100億個(gè)神經(jīng)元之間的連接。V1層隨后和其他視覺皮層V2、V3、V4、V5和V6連接,以進(jìn)一步處理更復(fù)雜的圖像信息,并識(shí)別更復(fù)雜的視覺元素,如形狀、面部、動(dòng)物等。這種分層組織是1億年間無(wú)數(shù)次嘗試的結(jié)果。據(jù)估計(jì),人類大腦包含大約160億個(gè)腦皮質(zhì)神經(jīng)細(xì)胞,其中10%~25%是負(fù)責(zé)視覺信息處理的(更多信息,請(qǐng)參考文章《TheHumanBraininNumbers:ALinearlyScaled-upPrimateBrain》,作者S.Herculano-Houzel,vol.3,2009)。深度學(xué)習(xí)就是從人類大腦視覺系統(tǒng)的層次結(jié)構(gòu)中獲得了啟發(fā),前面的人工神經(jīng)網(wǎng)絡(luò)層負(fù)責(zé)學(xué)習(xí)圖像基本信息,更深的網(wǎng)絡(luò)層負(fù)責(zé)學(xué)習(xí)更復(fù)雜的概念。本書涵蓋了神經(jīng)網(wǎng)絡(luò)的幾個(gè)主要方面,并提供了基于Keras和最小有效Python庫(kù)作為深度學(xué)習(xí)計(jì)算的可運(yùn)行網(wǎng)絡(luò)實(shí)例編碼,后端基于谷歌的TensorFlow或者蒙特利爾大學(xué)的Theano框架。好的,讓我們切入正題。在本章,我們將介紹以下內(nèi)容:感知機(jī)多層感知機(jī)激活函數(shù)梯度下降隨機(jī)梯度下降反向傳播算法1.1感知機(jī)感知機(jī)是一個(gè)簡(jiǎn)單的算法,給定n維向量x(x1,x2,…,xn)作為輸入,通常稱作輸入特征或者簡(jiǎn)單特征,輸出為1(是)或0(否)。數(shù)學(xué)上,我們定義以下函數(shù):這里,w是權(quán)重向量,wx是點(diǎn)積(譯者注:也稱內(nèi)積、數(shù)量積或標(biāo)量積),b是偏差。如果你還記得基礎(chǔ)的幾何知識(shí),就應(yīng)該知道wx+b定義了一個(gè)邊界超平面,我們可以通過(guò)設(shè)置w和b的值來(lái)改變它的位置。如果x位于直線之上,則結(jié)果為正,否則為負(fù)。非常簡(jiǎn)單的算法!感知機(jī)不能表示非確定性答案。如果我們知道如何定義w和b,就能回答是(1)或否(0)。接下來(lái)我們將討論這個(gè)訓(xùn)練過(guò)程。第一個(gè)Keras代碼示例Keras的原始構(gòu)造模塊是模型,最簡(jiǎn)單的模型稱為序貫?zāi)P?,Keras的序貫?zāi)P褪巧窠?jīng)網(wǎng)絡(luò)層的線性管道(堆棧)。以下代碼段定義了一個(gè)包含12個(gè)人工神經(jīng)元的單層網(wǎng)絡(luò),它預(yù)計(jì)有8個(gè)輸入變量(也稱為特征):fromkeras.modelsimportSequential
model=Sequential()
model.add(Dense(12,input_dim=8,kernel_initializer='random_uniform'))
每個(gè)神經(jīng)元可以用特定的權(quán)重進(jìn)行初始化。Keras提供了幾個(gè)選擇,其中最常用的選擇如下所示。random_uniform:初始化權(quán)重為(–0.05,0.05)之間的均勻隨機(jī)的微小數(shù)值。換句話說(shuō),給定區(qū)間里的任何值都可能作為權(quán)重。random_normal:根據(jù)高斯分布初始化權(quán)重,平均值為0,標(biāo)準(zhǔn)差為0.05。如果你不熟悉高斯分布,可以回想一下對(duì)稱鐘形曲線。zero:所有權(quán)重初始化為0。完整選項(xiàng)列表請(qǐng)參考Keras官網(wǎng)。1.2多層感知機(jī)——第一個(gè)神經(jīng)網(wǎng)絡(luò)的示例在本章中,我們將定義一個(gè)多層線性網(wǎng)絡(luò),并將其作為本書的第一個(gè)代碼示例。從歷史上來(lái)看,感知機(jī)這個(gè)名稱是指具有單一線性層的模型,因此,如果它有多層,我們就可以稱之為多層感知機(jī)(Multilayerperceptron,MLP)。圖1.1展示了一個(gè)一般的神經(jīng)網(wǎng)絡(luò),它具有一個(gè)輸入層、一個(gè)中間層和一個(gè)輸出層。圖1.1在圖1.1中,第一層中的每個(gè)節(jié)點(diǎn)接收一個(gè)輸入,并根據(jù)預(yù)設(shè)的本地決策邊界值確定是否激發(fā)。然后,第一層的輸出傳遞給中間層,中間層再傳遞給由單一神經(jīng)元組成的最終的輸出層。有趣的是,這種分層組織似乎模仿了我們前面討論過(guò)的人類的視覺系統(tǒng)。全連接的網(wǎng)絡(luò)是指每層中的每個(gè)神經(jīng)元和上一層的所有神經(jīng)元有連接,和下一層的所有神經(jīng)元也都有連接。1.2.1感知機(jī)訓(xùn)練方案中的問題讓我們來(lái)考慮一個(gè)單一的神經(jīng)元如何選擇最佳的權(quán)重w和偏差b?理想情況下,我們想提供一組訓(xùn)練樣本,讓機(jī)器通過(guò)調(diào)整權(quán)重值和偏差值,使輸出誤差最小化。為了更加的具體,我們假設(shè)有一組包含貓的圖像,以及另外單獨(dú)的一組不包含貓的圖像。為了簡(jiǎn)單起見,假設(shè)每個(gè)神經(jīng)元只考慮單個(gè)輸入像素值。當(dāng)計(jì)算機(jī)處理這些圖像時(shí),我們希望我們的神經(jīng)元調(diào)整其權(quán)重和偏差,使得越來(lái)越少的圖像被錯(cuò)誤識(shí)別為非貓。這種方法似乎非常直觀,但是它要求權(quán)重(和/或偏差)的微小變化只會(huì)在輸出上產(chǎn)生微小變化。如果我們有一個(gè)較大的輸出增量,我們就不能進(jìn)行漸進(jìn)式學(xué)習(xí)(而非在所有的方向上進(jìn)行嘗試——這樣的過(guò)程稱為窮舉搜索——我們不知道是否在改進(jìn))。畢竟,小孩子是一點(diǎn)一點(diǎn)學(xué)習(xí)的。不幸的是,感知機(jī)并不表現(xiàn)出這種一點(diǎn)一點(diǎn)學(xué)習(xí)的行為,感知機(jī)的結(jié)果是0或1,這是一個(gè)大的增量,它對(duì)學(xué)習(xí)沒有幫助,如圖1.2所示。我們需要一些更平滑的東西,一個(gè)從0到1逐漸變化不間斷的函數(shù)。在數(shù)學(xué)上,這意味著我們需要一個(gè)可以計(jì)算其導(dǎo)數(shù)的連續(xù)的函數(shù)。圖激活函數(shù)——sigmoidsigmoid函數(shù)的定義如下:如圖1.3所示,當(dāng)輸入在(?∞,∞)的區(qū)間上變化時(shí),位于(0,1)區(qū)間上的輸出值變化很小。從數(shù)學(xué)的角度講,該函數(shù)是連續(xù)的。典型的sigmoid函數(shù)如圖1.3所示。圖1.3神經(jīng)元可以使用sigmoid來(lái)計(jì)算非線性函數(shù)σ(z=wx+b)。注意,如果z=wx+b是非常大的正值,那么e?z→0,因而σ(z)→1;而如果z=wx+b是非常大的負(fù)值,e?z→∞,因而σ(z)→0。換句話說(shuō),以sigmoid為激活函數(shù)的神經(jīng)元具有和感知機(jī)類似的行為,但它的變化是漸進(jìn)的,輸出值如0.5539或0.123191非常合理。在這個(gè)意義上,sigmoid神經(jīng)元可能正是我們所要的。1.2.3激活函數(shù)——ReLUsigmoid并非可用于神經(jīng)網(wǎng)絡(luò)的唯一的平滑激活函數(shù)。最近,一個(gè)被稱為修正線性單元(RectifiedLinearUnit,ReLU)的激活函數(shù)很受歡迎,因?yàn)樗梢援a(chǎn)生非常好的實(shí)驗(yàn)結(jié)果。ReLU函數(shù)簡(jiǎn)單定義為f(x)=max(0,x),這個(gè)非線性函數(shù)如圖1.4所示。對(duì)于負(fù)值,函數(shù)值為零;對(duì)于正值,函數(shù)呈線性增長(zhǎng)。圖激活函數(shù)在神經(jīng)網(wǎng)絡(luò)領(lǐng)域,sigmoid和ReLU通常被稱為激活函數(shù)。在“Keras中的不同優(yōu)化器測(cè)試”一節(jié)中,我們將看到,那些通常由sigmoid和ReLU函數(shù)產(chǎn)生的漸進(jìn)的變化,構(gòu)成了開發(fā)學(xué)習(xí)算法的基本構(gòu)件,這些構(gòu)件通過(guò)逐漸減少網(wǎng)絡(luò)中發(fā)生的錯(cuò)誤,來(lái)一點(diǎn)一點(diǎn)進(jìn)行調(diào)整。圖1.5給出了一個(gè)使用σ激活函數(shù)的例子,其中(x1,x2,…,xm)為輸入向量,(w1,w2,…,wm)為權(quán)重向量,b為偏差,表示總和。圖1.5Keras支持多種激活函數(shù),完整列表請(qǐng)參考Keras官網(wǎng)。1.3實(shí)例——手寫數(shù)字識(shí)別在本節(jié)中,我們將構(gòu)建一個(gè)可識(shí)別手寫數(shù)字的網(wǎng)絡(luò)。為此,我們使用MNIST數(shù)據(jù)集,這是一個(gè)由60000個(gè)訓(xùn)練樣例和10000個(gè)測(cè)試樣例組成的手寫數(shù)字?jǐn)?shù)據(jù)庫(kù)。訓(xùn)練樣例由人標(biāo)注出正確答案,例如,如果手寫數(shù)字是“3”,那么“3”就是該樣例關(guān)聯(lián)的標(biāo)簽。在機(jī)器學(xué)習(xí)中,如果使用的是帶有正確答案的數(shù)據(jù)集,我們就說(shuō)我們?cè)谶M(jìn)行監(jiān)督學(xué)習(xí)。在這種情況下,我們可以使用訓(xùn)練樣例調(diào)整網(wǎng)絡(luò)。測(cè)試樣例也帶有與每個(gè)數(shù)字關(guān)聯(lián)的正確答案。然而,這種情況下,我們要假裝標(biāo)簽未知,從而讓網(wǎng)絡(luò)進(jìn)行預(yù)測(cè),稍后再借助標(biāo)簽來(lái)評(píng)估我們的神經(jīng)網(wǎng)絡(luò)對(duì)于識(shí)別數(shù)字的學(xué)習(xí)程度。因此,如你所料,測(cè)試樣例只用于測(cè)試我們的網(wǎng)絡(luò)。每個(gè)MNIST圖像都是灰度的,它由28×28像素組成。這些數(shù)字的一個(gè)子集如圖1.6所示。圖One-hot編碼——OHE在很多應(yīng)用中,將類別(非數(shù)字)特征轉(zhuǎn)換為數(shù)值變量都很方便。例如,[0-9]中值為d的分類特征數(shù)字可以編碼為10位二進(jìn)制向量,除了第d位為1,其他位始終為0。這類表示法稱為One-hot編碼(OHE),當(dāng)數(shù)據(jù)挖掘中的學(xué)習(xí)算法專門用于處理數(shù)值函數(shù)時(shí),這種編碼的使用非常普遍。1.3.2用Keras定義簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)這里,我們使用Keras定義一個(gè)識(shí)別MNIST手寫數(shù)字的網(wǎng)絡(luò)。我們從一個(gè)非常簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)開始,然后逐步改進(jìn)。Keras提供了必要的庫(kù)來(lái)加載數(shù)據(jù)集,并將其劃分成用于微調(diào)網(wǎng)絡(luò)的訓(xùn)練集X_train,以及用于評(píng)估性能的測(cè)試集X_test。數(shù)據(jù)轉(zhuǎn)換為支持GPU計(jì)算的float32類型,并歸一化為[0,1]。另外,我們將真正的標(biāo)簽各自加載到Y(jié)_train和Y_test中,并對(duì)其進(jìn)行One-hot編碼。我們來(lái)看以下代碼:from__future__importprint_function
importnumpyasnp
fromkeras.datasetsimportmnist
fromkeras.modelsimportSequential
fromkeras.layers.coreimportDense,Activation
fromkeras.optimizersimportSGD
fromkeras.utilsimportnp_utils
np.random.seed(1671)#重復(fù)性設(shè)置
#網(wǎng)絡(luò)和訓(xùn)練
NB_EPOCH=200
BATCH_SIZE=128
VERBOSE=1
NB_CLASSES=10#輸出個(gè)數(shù)等于數(shù)字個(gè)數(shù)
OPTIMIZER=SGD()#SGD優(yōu)化器,本章稍后介紹
N_HIDDEN=128
VALIDATION_SPLIT=0.2#訓(xùn)練集中用作驗(yàn)證集的數(shù)據(jù)比例
#數(shù)據(jù):混合并劃分訓(xùn)練集和測(cè)試集數(shù)據(jù)
#
(X_train,y_train),(X_test,y_test)=mnist.load_data()
#X_train是60000行28×28的數(shù)據(jù),變形為60000×784
RESHAPED=784
#
X_train=X_train.reshape(60000,RESHAPED)
X_test=X_test.reshape(10000,RESHAPED)
X_train=X_train.astype('float32')
X_test=X_test.astype('float32')
#歸一化
#
X_train/=255
X_test/=255
print(X_train.shape[0],'trainsamples')
print(X_test.shape[0],'testsamples')
#將類向量轉(zhuǎn)換為二值類別矩陣
Y_train=np_utils.to_categorical(y_train,NB_CLASSES)
Y_test=np_utils.to_categorical(y_test,NB_CLASSES)
輸入層中,每個(gè)像素都有一個(gè)神經(jīng)元與其關(guān)聯(lián),因而共有28×28=784個(gè)神經(jīng)元,每個(gè)神經(jīng)元對(duì)應(yīng)MNIST圖像中的一個(gè)像素。通常來(lái)說(shuō),與每個(gè)像素關(guān)聯(lián)的值被歸一化到[0,1]區(qū)間中(即每個(gè)像素的亮度除以255,255是最大亮度值)。輸出為10個(gè)類別,每個(gè)數(shù)字對(duì)應(yīng)一個(gè)類。最后一層是使用激活函數(shù)softmax的單個(gè)神經(jīng)元,它是sigmoid函數(shù)的擴(kuò)展。softmax將任意k維實(shí)向量壓縮到區(qū)間(0,1)上的k維實(shí)向量。在我們的例子中,它聚合了上一層中由10個(gè)神經(jīng)元給出的10個(gè)答案。#10個(gè)輸出
#最后是softmax激活函數(shù)
model=Sequential()
model.add(Dense(NB_CLASSES,input_shape=(RESHAPED,)))
model.add(Activation('softmax'))
model.summary()
一旦我們定義好模型,我們就要對(duì)它進(jìn)行編譯,這樣它才能由Keras后端(Theano或TensorFlow)執(zhí)行。編譯期間有以下幾個(gè)選項(xiàng)。我們需要選擇優(yōu)化器,這是訓(xùn)練模型時(shí)用于更新權(quán)重的特定算法。我們需要選擇優(yōu)化器使用的目標(biāo)函數(shù),以確定權(quán)重空間(目標(biāo)函數(shù)往往被稱為損失函數(shù),優(yōu)化過(guò)程也被定義為損失最小化的過(guò)程)。我們需要評(píng)估訓(xùn)練好的模型。目標(biāo)函數(shù)的一些常見選項(xiàng)(Keras目標(biāo)函數(shù)的完整列表請(qǐng)參考官網(wǎng))如下所示。MSE:預(yù)測(cè)值和真實(shí)值之間的均方誤差。從數(shù)學(xué)上講,如果γ是n個(gè)預(yù)測(cè)值的向量,Y是n個(gè)觀測(cè)值的向量,則它們滿足以下等式:這些目標(biāo)函數(shù)平均了所有預(yù)測(cè)錯(cuò)誤,并且如果預(yù)測(cè)遠(yuǎn)離真實(shí)值,平方運(yùn)算將讓該差距更加明顯。Binarycross-entropy:這是二分對(duì)數(shù)損失。假設(shè)我們的模型在目標(biāo)值為t時(shí)預(yù)測(cè)結(jié)果為p,則二分交叉熵定義如下:?tlog(p)?(1?t)log(1?p)該目標(biāo)函數(shù)適用于二元標(biāo)簽預(yù)測(cè)。Categoricalcross-entropy:這是多分類對(duì)數(shù)損失。如果目標(biāo)值為ti,j時(shí)預(yù)測(cè)結(jié)果為pi,j,則分類交叉熵是:該目標(biāo)函數(shù)適用于多分類標(biāo)簽預(yù)測(cè)。它也是與激活函數(shù)softmax關(guān)聯(lián)的默認(rèn)選擇。一些常見的性能評(píng)估指標(biāo)(Keras性能評(píng)估指標(biāo)的完整列表請(qǐng)參考官網(wǎng))如下所示。Accuracy:準(zhǔn)確率,針對(duì)預(yù)測(cè)目標(biāo)的預(yù)測(cè)正確的比例。Precision:查準(zhǔn)率,衡量多分類問題中多少選擇項(xiàng)是關(guān)聯(lián)正確的。Recall:查全率,衡量多分類問題中多少關(guān)聯(lián)正確的數(shù)據(jù)被選出。性能評(píng)估與目標(biāo)函數(shù)類似,唯一的區(qū)別是它們不用于訓(xùn)練模型,而只用于評(píng)估模型。在Keras中編譯模型很容易:pile(loss='categorical_crossentropy',optimizer=OPTIMIZER,metrics=['accuracy'])
一旦模型編譯好,就可以用fit()函數(shù)進(jìn)行訓(xùn)練了,該函數(shù)指定了以下參數(shù)。epochs:訓(xùn)練輪數(shù),是模型基于訓(xùn)練集重復(fù)訓(xùn)練的次數(shù)。在每次迭代中,優(yōu)化器嘗試調(diào)整權(quán)重,以使目標(biāo)函數(shù)最小化。batch_size:這是優(yōu)化器進(jìn)行權(quán)重更新前要觀察的訓(xùn)練實(shí)例數(shù)。在Keras中訓(xùn)練一個(gè)模型很簡(jiǎn)單。假設(shè)我們要迭代NB_EPOCH步:history=model.fit(X_train,Y_train,
batch_size=BATCH_SIZE,epochs=NB_EPOCH,
verbose=VERBOSE,validation_split=VALIDATION_SPLIT)
我們留出訓(xùn)練集的部分?jǐn)?shù)據(jù)用于驗(yàn)證。關(guān)鍵的思想是我們要基于這部分留出的訓(xùn)練集數(shù)據(jù)做性能評(píng)估。對(duì)任何機(jī)器學(xué)習(xí)任務(wù),這都是值得采用的最佳實(shí)踐方法,我們也將這一方法應(yīng)用在所有的例子中。一旦模型訓(xùn)練好,我們就可以在包含全新樣本的測(cè)試集上進(jìn)行評(píng)估。這樣,我們就可以通過(guò)目標(biāo)函數(shù)獲得最小值,并通過(guò)性能評(píng)估獲得最佳值。注意,訓(xùn)練集和測(cè)試集應(yīng)是嚴(yán)格分開的。在一個(gè)已經(jīng)用于訓(xùn)練的樣例上進(jìn)行模型的性能評(píng)估是沒有意義的。學(xué)習(xí)本質(zhì)上是一個(gè)推測(cè)未知事實(shí)的過(guò)程,而非記憶已知的內(nèi)容。score=model.evaluate(X_test,Y_test,verbose=VERBOSE)
print("Testscore:",score[0])
print('Testaccuracy:',score[1])
恭喜,你已在Keras中定義了你的第一個(gè)神經(jīng)網(wǎng)絡(luò)。僅幾行代碼,你的計(jì)算機(jī)已經(jīng)能識(shí)別手寫數(shù)字了。讓我們運(yùn)行代碼,并看看其性能。1.3.3運(yùn)行一個(gè)簡(jiǎn)單的Keras網(wǎng)絡(luò)并創(chuàng)建基線讓我們看看代碼運(yùn)行結(jié)果,如圖1.7所示。圖1.7首先,網(wǎng)絡(luò)結(jié)構(gòu)被鋪開,我們可以看到使用的不同類型的網(wǎng)絡(luò)層、它們的輸出形狀、需要優(yōu)化的參數(shù)個(gè)數(shù),以及它們的連接方式。之后,網(wǎng)絡(luò)在48000個(gè)樣本上進(jìn)行訓(xùn)練,12000個(gè)樣本被保留并用于驗(yàn)證。一旦構(gòu)建好神經(jīng)網(wǎng)絡(luò)模型,就可以在10000個(gè)樣本上進(jìn)行測(cè)試。如你所見,Keras內(nèi)部使用了TensorFlow作為后端系統(tǒng)進(jìn)行計(jì)算?,F(xiàn)在,我們不探究?jī)?nèi)部訓(xùn)練細(xì)節(jié),但我們可以注意到該程序運(yùn)行了200次迭代,每次迭代后,準(zhǔn)確率都有所提高。訓(xùn)練結(jié)束后,我們用測(cè)試數(shù)據(jù)對(duì)模型進(jìn)行測(cè)試,其中訓(xùn)練集上達(dá)到的準(zhǔn)確率為92.36%,驗(yàn)證集上的準(zhǔn)確率為92.27%,測(cè)試集上的準(zhǔn)確率為92.22%。這意味著10個(gè)手寫數(shù)字中只有不到一個(gè)沒有被正確識(shí)別。當(dāng)然我們可以比這做得更好。在圖1.8中,我們可以看到測(cè)試的準(zhǔn)確率。圖用隱藏層改進(jìn)簡(jiǎn)單網(wǎng)絡(luò)現(xiàn)在我們有了基線精度,訓(xùn)練集上的準(zhǔn)確率為92.36%,驗(yàn)證集上的準(zhǔn)確率為92.27%,測(cè)試集上的準(zhǔn)確率為92.22%,這是一個(gè)很好的起點(diǎn),當(dāng)然我們還能對(duì)它進(jìn)行提升,我們看一下如何改進(jìn)。第一個(gè)改進(jìn)方法是為我們的網(wǎng)絡(luò)添加更多的層。所以在輸入層之后,我們有了第一個(gè)具有N_HIDDEN個(gè)神經(jīng)元并將ReLU作為激活函數(shù)的dense層。這一個(gè)追加層被認(rèn)為是隱藏的,因?yàn)樗炔慌c輸入層也不與輸出層直接相連。在第一個(gè)隱藏層之后,是第二個(gè)隱藏層,這一隱藏層同樣具有N_HIDDEN個(gè)神經(jīng)元,其后是一個(gè)具有10個(gè)神經(jīng)元的輸出層,當(dāng)相關(guān)數(shù)字被識(shí)別時(shí),對(duì)應(yīng)的神經(jīng)元就會(huì)被觸發(fā)。以下代碼定義了這個(gè)新網(wǎng)絡(luò)。from__future__importprint_function
importnumpyasnp
fromkeras.datasetsimportmnist
fromkeras.modelsimportSequential
fromkeras.layers.coreimportDense,Activation
fromkeras.optimizersimportSGD
fromkeras.utilsimportnp_utils
np.random.seed(1671)#重復(fù)性設(shè)置
#網(wǎng)絡(luò)和訓(xùn)練
NB_EPOCH=20
BATCH_SIZE=128
VERBOSE=1
NB_CLASSES=10#輸出個(gè)數(shù)等于數(shù)字個(gè)數(shù)
OPTIMIZER=SGD()#優(yōu)化器,本章稍后介紹
N_HIDDEN=128
VALIDATION_SPLIT=0.2#訓(xùn)練集用于驗(yàn)證的劃分比例
#數(shù)據(jù):混合并劃分訓(xùn)練集和測(cè)試集數(shù)據(jù)
(X_train,y_train),(X_test,y_test)=mnist.load_data()
#X_train是60000行28×28的數(shù)據(jù),變形為60000×784
RESHAPED=784
#
X_train=X_train.reshape(60000,RESHAPED)
X_test=X_test.reshape(10000,RESHAPED)
X_train=X_train.astype('float32')
X_test=X_test.astype('float32')
#歸一化
X_train/=255
X_test/=255
print(X_train.shape[0],'trainsamples')
print(X_test.shape[0],'testsamples')
#將類向量轉(zhuǎn)換為二值類別矩陣
Y_train=np_utils.to_categorical(y_train,NB_CLASSES)
Y_test=np_utils.to_categorical(y_test,NB_CLASSES)
#M_HIDDEN個(gè)隱藏層
#10個(gè)輸出
#最后是softmax激活函數(shù)
model=Sequential()
model.add(Dense(N_HIDDEN,input_shape=(RESHAPED,)))
model.add(Activation('relu'))
model.add(Dense(N_HIDDEN))
model.add(Activation('relu'))
model.add(Dense(NB_CLASSES))
model.add(Activation('softmax'))
model.summary()
pile(loss='categorical_crossentropy',
optimizer=OPTIMIZER,
metrics=['accuracy'])
history=model.fit(X_train,Y_train,
batch_size=BATCH_SIZE,epochs=NB_EPOCH,
verbose=VERBOSE,validation_split=VALIDATION_SPLIT)
score=model.evaluate(X_test,Y_test,verbose=VERBOSE)
print("Testscore:",score[0])
print('Testaccuracy:',score[1])
讓我們運(yùn)行代碼并查看這一多層網(wǎng)絡(luò)獲取的結(jié)果。還不錯(cuò),通過(guò)增加兩個(gè)隱藏層,我們?cè)谟?xùn)練集上達(dá)到的準(zhǔn)確率為94.50%,驗(yàn)證集上為94.63%,測(cè)試集上為94.41%。這意味著相比之前的網(wǎng)絡(luò),準(zhǔn)確率提高了2.2%。然而,我們將迭代次數(shù)從200顯著減少到了20。這很好,但是我們要更進(jìn)一步。如果你想,你可以自己嘗試,看看如果只添加一個(gè)隱藏層而非兩個(gè),或者添加兩個(gè)以上的隱藏層結(jié)果會(huì)怎樣。我把這個(gè)實(shí)驗(yàn)留作練習(xí)。圖1.9顯示了前例的輸出結(jié)果。圖用dropout進(jìn)一步改進(jìn)簡(jiǎn)單網(wǎng)絡(luò)現(xiàn)在我們的基線在訓(xùn)練集上的準(zhǔn)確率為94.50%,驗(yàn)證集上為94.63%,測(cè)試集上為94.41%。第二個(gè)改進(jìn)方法很簡(jiǎn)單。我們決定在內(nèi)部全連接的隱藏層上傳播的值里,按dropout概率隨機(jī)丟棄某些值。在機(jī)器學(xué)習(xí)中,這是一種眾所周知的正則化形式。很驚奇,這種隨機(jī)丟棄一些值的想法可以提高我們的性能。from__future__importprint_function
importnumpyasnp
fromkeras.datasetsimportmnist
fromkeras.modelsimportSequential
fromkeras.layers.coreimportDense,Dropout,Activation
fromkeras.optimizersimportSGD
fromkeras.utilsimportnp_utils
np.random.seed(1671)#重復(fù)性設(shè)置
#網(wǎng)絡(luò)和訓(xùn)練
NB_EPOCH=250
BATCH_SIZE=128
VERBOSE=1
NB_CLASSES=10#輸出個(gè)數(shù)等于數(shù)字個(gè)數(shù)
OPTIMIZER=SGD()#優(yōu)化器,本章稍后介紹
N_HIDDEN=128
VALIDATION_SPLIT=0.2#訓(xùn)練集用于驗(yàn)證的劃分比例
DROPOUT=0.3
#數(shù)據(jù):混合并劃分訓(xùn)練集和測(cè)試集數(shù)據(jù)
(X_train,y_train),(X_test,y_test)=mnist.load_data()
#X_train是60000行28×28的數(shù)據(jù),變形為60000×784
RESHAPED=784
#
X_train=X_train.reshape(60000,RESHAPED)
X_test=X_test.reshape(10000,RESHAPED)
X_train=X_train.astype('float32')
X_test=X_test.astype('float32')
#歸一化
X_train/=255
X_test/=255
#將類向量轉(zhuǎn)換為二值類別矩陣
Y_train=np_utils.to_categorical(y_train,NB_CLASSES)
Y_test=np_utils.to_categorical(y_test,NB_CLASSES)
#M_HIDDEN個(gè)隱藏層,10個(gè)輸出
model=Sequential()
model.add(Dense(N_HIDDEN,input_shape=(RESHAPED,)))
model.add(Activation('relu'))
model.add(Dropout(DROPOUT))
model.add(Dense(N_HIDDEN))
model.add(Activation('relu'))
model.add(Dropout(DROPOUT))
model.add(Dense(NB_CLASSES))
model.add(Activation('softmax'))
model.summary()
pile(loss='categorical_crossentropy',
optimizer=OPTIMIZER,
metrics=['accuracy'])
history=model.fit(X_train,Y_train,
batch_size=BATCH_SIZE,epochs=NB_EPOCH,
verbose=VERBOSE,validation_split=VALIDATION_SPLIT)
score=model.evaluate(X_test,Y_test,verbose=VERBOSE)
print("Testscore:",score[0])
print('Testaccuracy:',score[1])
讓我們將代碼像之前一樣運(yùn)行20次迭代。我們看到網(wǎng)絡(luò)在訓(xùn)練集上達(dá)到了91.54%的準(zhǔn)確率,驗(yàn)證集上為94.48%,測(cè)試集上為94.25%,如圖1.10所示。圖1.10注意,訓(xùn)練集上的準(zhǔn)確率仍應(yīng)高于測(cè)試集上的準(zhǔn)確率,否則說(shuō)明我們的訓(xùn)練時(shí)間還不夠長(zhǎng)。所以我們?cè)囍鴮⒂?xùn)練輪數(shù)大幅增加至250,這時(shí)訓(xùn)練集上的準(zhǔn)確率達(dá)到了98.1%,驗(yàn)證集上為97.73%,測(cè)試集上為97.7%,如圖1.11所示。圖1.11當(dāng)訓(xùn)練輪數(shù)增加時(shí),觀察訓(xùn)練集和測(cè)試集上的準(zhǔn)確率是如何增加的,這一點(diǎn)很有用。你可以從圖1.12中看出,這兩條曲線在訓(xùn)練約250輪時(shí)相交,而這一點(diǎn)后就沒必要進(jìn)一步訓(xùn)練了。圖1.12注意,我們往往會(huì)觀察到,內(nèi)部隱藏層中帶有隨機(jī)dropout層的網(wǎng)絡(luò),可以對(duì)測(cè)試集中的全新樣本做出更好的推測(cè)。直觀地講,你可以想象成:正因?yàn)樯窠?jīng)元知道不能依賴于鄰近神經(jīng)元,它自身的能力才能更好發(fā)揮。測(cè)試時(shí),先不加入dropout層,我們運(yùn)行的是所有經(jīng)過(guò)高度調(diào)整過(guò)的神經(jīng)元。簡(jiǎn)而言之,要測(cè)試網(wǎng)絡(luò)加入某些dropout功能時(shí)的表現(xiàn),這通常是一種很好的方法。1.3.6Keras中的不同優(yōu)化器測(cè)試我們已定義和使用了一個(gè)網(wǎng)絡(luò),給出網(wǎng)絡(luò)如何訓(xùn)練的直觀解釋非常有用。讓我們關(guān)注一種被稱為梯度下降(GradientDescent,GD)的流行的訓(xùn)練方法。想象一個(gè)含有單一變量w的一般成本函數(shù)C(w),如圖1.13所示。圖1.13梯度下降可以看成一個(gè)要從山上到山谷的背包客,山上表示成函數(shù)C,山谷表示成最小值Cmin,背包客的起點(diǎn)為w0。背包客慢慢移動(dòng),對(duì)每一步r,梯度就是最大增量的方向。從數(shù)學(xué)上講,該方向就是在步r到達(dá)的點(diǎn)wr上求得的偏導(dǎo)數(shù)。因此,走相反的方向,背包客就可以向山谷移動(dòng)。每一步,背包客都能在下一步之前判別步長(zhǎng),這就是梯度下降中講的學(xué)習(xí)率。注意,如果步長(zhǎng)太小,背包客就會(huì)移動(dòng)得很慢;如果過(guò)大,背包客又很可能錯(cuò)過(guò)山谷?,F(xiàn)在,你應(yīng)該記住sigmoid是一個(gè)連續(xù)函數(shù),并可以計(jì)算導(dǎo)數(shù)??梢宰C明sigmoid函數(shù)如下所示:它的導(dǎo)數(shù)如下:ReLU函數(shù)在點(diǎn)0處不可微,然而,我們可以將點(diǎn)0處的一階導(dǎo)數(shù)擴(kuò)展到整個(gè)定義域,使其為0或1。這種和點(diǎn)相關(guān)的ReLU函數(shù)y=max(0,x)的導(dǎo)數(shù)如下:一旦我們有了導(dǎo)數(shù),就可以用梯度下降技術(shù)來(lái)優(yōu)化網(wǎng)絡(luò)。Keras使用它的后端(TensorFlow或者Theano)來(lái)幫助我們計(jì)算導(dǎo)數(shù),所以我們不用擔(dān)心如何實(shí)現(xiàn)或計(jì)算它。我們只需選擇激活函數(shù),Keras會(huì)替我們計(jì)算導(dǎo)數(shù)。神經(jīng)網(wǎng)絡(luò)本質(zhì)上是帶有幾千個(gè)甚至幾百萬(wàn)個(gè)參數(shù)的多個(gè)函數(shù)的組合。每個(gè)網(wǎng)絡(luò)層計(jì)算一個(gè)函數(shù),使其錯(cuò)誤率最低,以改善學(xué)習(xí)階段觀察到的準(zhǔn)確率。當(dāng)我們討論反向傳播時(shí),我們會(huì)發(fā)現(xiàn)這個(gè)最小化過(guò)程比我們的簡(jiǎn)單示例更加復(fù)雜。然而,它同樣基于降至山谷的直觀過(guò)程。Keras實(shí)現(xiàn)了梯度下降的一個(gè)快速變體,稱為隨機(jī)梯度下降(StochasticGradientDescent,SGD),以及RMSprop和Adam這兩種更先進(jìn)的優(yōu)化技術(shù)。除SGD具有的加速度分量之外,RMSprop和Adam還包括了動(dòng)量的概念(速度分量)。這樣可以通過(guò)更多的計(jì)算代價(jià)實(shí)現(xiàn)更快的收斂。Keras支持的優(yōu)化器的完整列表請(qǐng)參考官網(wǎng)。SGD是我們到目前為止的默認(rèn)選擇。現(xiàn)在讓我們嘗試另外兩個(gè),這很簡(jiǎn)單,我們只需要改幾行代碼:fromkeras.optimizersimportRMSprop,Adam
...
OPTIMIZER=RMSprop()#優(yōu)化器
好了,我們來(lái)進(jìn)行測(cè)試,如圖1.14所示。圖1.14從圖1.14可以看出,RMSprop比SDG快,因?yàn)閮H在20次迭代后我們就改進(jìn)了SDG,并能在訓(xùn)練集上達(dá)到97.97%的準(zhǔn)確率,驗(yàn)證集上為97.59%,測(cè)試集上為97.84%。為完整起見,讓我們看看準(zhǔn)確率和損失函數(shù)如何隨訓(xùn)練輪數(shù)的變化而改變,如圖1.15所示。圖1.15現(xiàn)在我們?cè)囋嚵硪粋€(gè)優(yōu)化器Adam()。這相當(dāng)簡(jiǎn)單,如下:OPTIMIZER=Adam()#優(yōu)化器
正如我們所看到的,Adam稍好些。使用Adam,訓(xùn)練20輪后,我們?cè)谟?xùn)練集上的準(zhǔn)確率達(dá)到了98.28%,驗(yàn)證集上達(dá)到了98.03%,測(cè)試集上達(dá)到了97.93%,如圖1.16所示。圖1.16這是我們修改過(guò)的第5個(gè)版本,請(qǐng)記住我們的初始基線是92.36%。到目前為止,我們做了漸進(jìn)式的改進(jìn);然而,獲得更高的準(zhǔn)確率現(xiàn)在越來(lái)越難。注意,我們使用了30%的dropout概率進(jìn)行優(yōu)化。為完整起見,我們?cè)谶x用Adam()作為優(yōu)化器的條件下,測(cè)試其他dropout概率下測(cè)試集上的準(zhǔn)確率報(bào)表,如圖1.17所示。圖增加訓(xùn)練輪數(shù)讓我們嘗試將訓(xùn)練中使用的輪轉(zhuǎn)次數(shù)從20增加到200,不幸的是,這讓我們的計(jì)算時(shí)間增加了1倍,但網(wǎng)絡(luò)并沒有任何改善。這個(gè)實(shí)驗(yàn)并沒成功,但我們知道了即使花更多的時(shí)間學(xué)習(xí),也不一定會(huì)對(duì)網(wǎng)絡(luò)有所提高。學(xué)習(xí)更多的是關(guān)于采用巧妙的技術(shù),而不是計(jì)算上花費(fèi)多少時(shí)間。讓我們追蹤一下程序第6次修改的結(jié)果,如圖1.18所示。圖控制優(yōu)化器的學(xué)習(xí)率另外一個(gè)我們可以進(jìn)行的嘗試是改變優(yōu)化器的學(xué)習(xí)參數(shù)。你可以從圖1.19中看出,最優(yōu)值接近0.001,這是優(yōu)化器的默認(rèn)學(xué)習(xí)率。不錯(cuò),Adam優(yōu)化器表現(xiàn)得非常好。圖增加內(nèi)部隱藏神經(jīng)元的數(shù)量我們還可以做另一個(gè)嘗試,那就是改變內(nèi)部隱藏神經(jīng)元的數(shù)量。我們用不斷增加的隱藏神經(jīng)元匯總得出實(shí)驗(yàn)結(jié)果。我們可以從圖1.20中看到,通過(guò)增加模型的復(fù)雜性,運(yùn)行時(shí)間也顯著增加,因?yàn)橛性絹?lái)越多的參數(shù)需要優(yōu)化。然而,隨著網(wǎng)絡(luò)的增長(zhǎng),我們通過(guò)增加網(wǎng)絡(luò)規(guī)模獲得的收益也越來(lái)越少。圖1.20圖1.21顯示了隨著隱藏神經(jīng)元的增多,每次迭代所需的時(shí)間。圖1.21圖1.22顯示了隨著隱藏神經(jīng)元的增多,準(zhǔn)確率的變化。圖0增加批處理的大小對(duì)訓(xùn)練集中提供的所有樣例,同時(shí)對(duì)輸入中給出的所有特征,梯度下降都嘗試將成本函數(shù)最小化。隨機(jī)梯度下降開銷更小,它只考慮BATCH_SIZE個(gè)樣例。因此,讓我們看一下改變這個(gè)參數(shù)時(shí)的效果。如圖1.23所示,最優(yōu)的準(zhǔn)確率在BATCH_SIZE=128時(shí)取得。圖1識(shí)別手寫數(shù)字的實(shí)驗(yàn)總結(jié)現(xiàn)在我們總結(jié)一下:使用5種不同的修改,我們可以將性能從92.36%提高到97.93%。首先,我們?cè)贙eras中定義一個(gè)簡(jiǎn)單層的網(wǎng)絡(luò);然后,我們通過(guò)增加隱藏層提高性能;最后,我們通過(guò)添加隨機(jī)的dropout層及嘗試不同類型的優(yōu)化器改善了測(cè)試集上的性能。結(jié)果匯總?cè)绫?.1所示。表1.1模型/準(zhǔn)確率訓(xùn)練驗(yàn)證測(cè)試Simple92.36%92.37%92.22%Twohidden(128)94.50%94.63%94.41%Dropout(30%)98.10%97.73%97.7%(200次)RMSprop97.97%97.59%97.84%(20次)Adam98.28%98.03%97.93%(20次)然而,接下來(lái)的兩個(gè)實(shí)驗(yàn)沒有顯著提高。增加內(nèi)部神經(jīng)元的數(shù)量會(huì)產(chǎn)生更復(fù)雜的模型,并需要更昂貴的計(jì)算,但它只有微小的收益。即使增加訓(xùn)練輪數(shù),也是同樣的結(jié)果。最后一個(gè)實(shí)驗(yàn)是修改優(yōu)化器的BATCH_SIZE。1.3.12采用正則化方法避免過(guò)擬合直觀地說(shuō),良好的機(jī)器學(xué)習(xí)模型應(yīng)在訓(xùn)練數(shù)據(jù)上取得較低的誤差。在數(shù)學(xué)上,這等同于給定構(gòu)建好的機(jī)器學(xué)習(xí)模型,使其在訓(xùn)練數(shù)據(jù)上的損失函數(shù)最小化,其公式表示如下:min:{loss(訓(xùn)練數(shù)據(jù)|模型)}然而,這可能還不夠。為捕捉訓(xùn)練數(shù)據(jù)內(nèi)在表達(dá)的所有關(guān)系,模型可能會(huì)變得過(guò)度復(fù)雜。而復(fù)雜性的增加可能會(huì)產(chǎn)生兩個(gè)負(fù)面后果。第一,復(fù)雜的模型可能需要大量的時(shí)間來(lái)執(zhí)行;第二,因其所有內(nèi)在關(guān)系都被記憶下來(lái),復(fù)雜的模型可能在訓(xùn)練數(shù)據(jù)上會(huì)取得優(yōu)秀的性能,但在驗(yàn)證數(shù)據(jù)上的性能卻并不好,因?yàn)閷?duì)于全新的數(shù)據(jù),模型不能進(jìn)行很好的泛化。再次重申,學(xué)習(xí)更多的是關(guān)于泛化而非記憶。圖1.24表示了在驗(yàn)證集和訓(xùn)練集上均呈下降的損失函數(shù)。然而,由于過(guò)度擬合,驗(yàn)證集上的某一點(diǎn)后,損失函數(shù)開始增加,如圖1.24所示。圖1.24根據(jù)經(jīng)驗(yàn),如果在訓(xùn)練期間,我們看到損失函數(shù)在驗(yàn)證集上初始下降后轉(zhuǎn)為增長(zhǎng),那就是一個(gè)過(guò)度訓(xùn)練的模型復(fù)雜度問題。實(shí)際上,過(guò)擬合是機(jī)器學(xué)習(xí)中用于準(zhǔn)確描述這一問題的名詞。為解決過(guò)擬合問題,我們需要一種捕捉模型復(fù)雜度的方法,即模型的復(fù)雜程度。解決方案會(huì)是什么呢?其實(shí),模型不過(guò)是權(quán)重向量,因此,模型復(fù)雜度可以方便地表示成非零權(quán)重的數(shù)量。換句話說(shuō),如果我們有兩個(gè)模型M1和M2,在損失函數(shù)上幾乎實(shí)現(xiàn)了同樣的性能,那么我們應(yīng)選擇最簡(jiǎn)單的包含最小數(shù)量非零權(quán)重的模型。如下所示,我們可以使用超參數(shù)λ≥0來(lái)控制擁有簡(jiǎn)單模型的重要性:min:{loss(訓(xùn)練數(shù)據(jù)|模型)}+λ*complexity(模型)機(jī)器學(xué)習(xí)中用到了3種不同類型的正則化方法。L1正則化(也稱為lasso):模型復(fù)雜度表示為權(quán)重的絕對(duì)值之和L2正則化(也稱為ridge):模型復(fù)雜度表示為權(quán)重的平方和彈性網(wǎng)絡(luò)正則化:模型復(fù)雜度通過(guò)聯(lián)合前述兩種技術(shù)捕捉注意,相同的正則化方案可以獨(dú)立地應(yīng)用于權(quán)重、模型和激活函數(shù)。因此,應(yīng)用正則化方案會(huì)是一個(gè)提高網(wǎng)絡(luò)性能的好方法,特別是在明顯出現(xiàn)了過(guò)擬合的情況下。這些實(shí)驗(yàn)可以留給對(duì)此感興趣的讀者作為練習(xí)。請(qǐng)注意,Keras同時(shí)支持L1、L2和彈性網(wǎng)絡(luò)這3種類型的正則化方法。加入正則化方法很簡(jiǎn)單。舉個(gè)例子,這里我們?cè)趦?nèi)核(權(quán)重W)上使用了L2正則化方法:fromkerasimportregularizersmodel.add(Dense(64,input_dim=64,
kernel_regularizer=regularizers.l2(0.01)))
關(guān)于可用參數(shù)的完整說(shuō)明,請(qǐng)參見Keras官網(wǎng)。1.3.13超參數(shù)調(diào)優(yōu)上述實(shí)驗(yàn)讓我們了解了微調(diào)網(wǎng)絡(luò)的可能方式。然而,對(duì)一個(gè)例子有效的方法不一定對(duì)其他例子也有效。對(duì)于給定的網(wǎng)絡(luò),實(shí)際上有很多可以優(yōu)化的參數(shù)(如隱藏神經(jīng)元的數(shù)量、BATCH_SIZE、訓(xùn)練輪數(shù),以及更多關(guān)于網(wǎng)絡(luò)本身復(fù)雜度的參數(shù)等)。超參數(shù)調(diào)優(yōu)是找到使成本函數(shù)最小化的那些參數(shù)組合的過(guò)程。關(guān)鍵思想是,如果我們有n個(gè)參數(shù),可以想象成它們定義了一個(gè)n維空間,目標(biāo)是找出空間中和成本函數(shù)最優(yōu)值對(duì)應(yīng)的點(diǎn)。實(shí)現(xiàn)此目標(biāo)的一種方法是在該空間中創(chuàng)建一個(gè)網(wǎng)格,并系統(tǒng)地檢查每個(gè)網(wǎng)格頂點(diǎn)的成本函數(shù)值。換句話說(shuō),這些參數(shù)被劃分成多個(gè)桶,并且通過(guò)蠻力法來(lái)檢查值的不同組合。1.3.14輸出預(yù)測(cè)當(dāng)網(wǎng)絡(luò)訓(xùn)練好后,它就可以用于預(yù)測(cè)。在Keras中,這很簡(jiǎn)單。我們可以使用以下方法:#計(jì)算預(yù)測(cè)
predictions=model.predict(X)
對(duì)于給定的輸入,可以計(jì)算出幾種類型的輸出,包括以下方法。model.evaluate():用于計(jì)算損失值model.predict_classes():用于計(jì)算輸出類別model.predict_proba():用于計(jì)算類別概率1.4一種實(shí)用的反向傳播概述多層感知機(jī)通過(guò)稱為反向傳播的過(guò)程在訓(xùn)練數(shù)據(jù)上學(xué)習(xí)。這是個(gè)錯(cuò)誤一經(jīng)發(fā)現(xiàn)就逐漸改進(jìn)的過(guò)程。讓我們看看它是如何工作的。請(qǐng)記住,每個(gè)神經(jīng)網(wǎng)絡(luò)層都有一組相關(guān)的權(quán)重,用于確定給定輸入集合的輸出值。此外,還請(qǐng)記住神經(jīng)網(wǎng)絡(luò)可以有多個(gè)隱藏層。開始時(shí),所有的權(quán)重都是隨機(jī)分配的。然后,網(wǎng)絡(luò)被訓(xùn)練集中的每個(gè)輸入激活:權(quán)重值從輸入階段開始向前傳播給隱藏層,隱藏層再向前傳播給進(jìn)行輸出預(yù)測(cè)的輸出層(注意,在簡(jiǎn)化圖1.25中,我們僅用綠色虛線表示幾個(gè)值,但實(shí)際上,所有值都是沿網(wǎng)絡(luò)前向傳播的)。圖1.25由于我們知道訓(xùn)練集中的真實(shí)觀察值,因而可以計(jì)算預(yù)測(cè)中產(chǎn)生的誤差?;厮莸年P(guān)鍵點(diǎn)是將誤差反向傳播,并使用適當(dāng)?shù)膬?yōu)化器算法,如梯度下降,來(lái)調(diào)整神經(jīng)網(wǎng)絡(luò)的權(quán)重,以減小誤差(同樣為了簡(jiǎn)單起見,只表示出幾個(gè)錯(cuò)誤值),如圖1.26所示。圖1.26將輸入到輸出的正向傳播和誤差的反向傳播過(guò)程重復(fù)幾次,直到誤差低于預(yù)定義的閾值。整個(gè)過(guò)程如圖1.27所示。圖1.27特征表示這里用于驅(qū)動(dòng)學(xué)習(xí)過(guò)程的輸入和標(biāo)簽。模型通過(guò)這樣的方式更新,損失函數(shù)被逐漸最小化。在神經(jīng)網(wǎng)絡(luò)中,真正重要的不是單個(gè)神經(jīng)元的輸出,而是在每層中調(diào)整的集體權(quán)重。因此,網(wǎng)絡(luò)以這樣的方式逐漸調(diào)整其內(nèi)部權(quán)重,預(yù)測(cè)正確的標(biāo)簽數(shù)量也跟著增多。當(dāng)然,使用正確的集合特征及高質(zhì)量的標(biāo)簽數(shù)據(jù)是在學(xué)習(xí)過(guò)程中偏差最小化的基礎(chǔ)。1.5走向深度學(xué)習(xí)之路識(shí)別手寫數(shù)字的同時(shí),我們得出結(jié)論,準(zhǔn)確率越接近99%,提升就越困難。如果想要有更多的改進(jìn),我們肯定需要一個(gè)全新的思路。想一想,我們錯(cuò)過(guò)了什么?基本的直覺是,目前為止,我們丟失了所有與圖像的局部空間相關(guān)的信息。特別地,這段代碼將位圖轉(zhuǎn)換成空間局部性消失的平面向量:#X_train是60000行28x28的數(shù)據(jù),變形為60000x784
X_train=X_train.reshape(60000,784)
X_test=X_test.reshape(10000,784)
然而,這并非我們大腦工作的方式。請(qǐng)記住,我們的想法是基于多個(gè)皮質(zhì)層,每一層都識(shí)別出越來(lái)越多的結(jié)構(gòu)化信息,并仍然保留了局部化信息。首先,我們看到單個(gè)的像素,然后從中識(shí)別出簡(jiǎn)單的幾何形狀,最后識(shí)別出更多的復(fù)雜元素,如物體、面部、人體、動(dòng)物等。在第3章“深度學(xué)習(xí)之卷積網(wǎng)絡(luò)”中,我們將看到一種特殊類型的深度學(xué)習(xí)網(wǎng)絡(luò),這種網(wǎng)絡(luò)被稱為卷積神經(jīng)網(wǎng)絡(luò)(ConvolutionalNeuralNetwork,CNN),它同時(shí)考慮了兩個(gè)方面:既保留圖像(更一般地,任何類型的信息)中空間局部性的信息,也保留層次漸進(jìn)的抽象學(xué)習(xí)的思想。一層時(shí),你只能學(xué)習(xí)簡(jiǎn)單模式;多層時(shí),你可以學(xué)習(xí)多種模式。在學(xué)習(xí)CNN之前,我們需要了解Keras架構(gòu)方面的內(nèi)容,并對(duì)一些機(jī)器學(xué)習(xí)概念進(jìn)行實(shí)用的介紹。這將是下一章的主題。1.6小結(jié)本章中,你學(xué)習(xí)了神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)知識(shí)。具體包括:什么是感知機(jī),什么是多層感知機(jī),如何在Keras中定義神經(jīng)網(wǎng)絡(luò),當(dāng)確立了良好的基線后如何逐步改進(jìn)性能,以及如何微調(diào)超參數(shù)空間。此外,你現(xiàn)在對(duì)一些有用的激活函數(shù)(sigmoid和ReLU)有了了解,還學(xué)習(xí)了如何基于反向傳播算法來(lái)訓(xùn)練網(wǎng)絡(luò),如梯度下降、隨機(jī)梯度下降,或更復(fù)雜的方法如Adam和RMSprop。在下一章中,我們將學(xué)習(xí)如何在AWS、微軟Azure、谷歌Cloud以及你自己的機(jī)器上安裝Keras。除此之外,我們還將給出KerasAPI的概述。第2章Keras安裝和API在上一章中,我們討論了神經(jīng)網(wǎng)絡(luò)的基本原理,并給出了幾個(gè)可用于識(shí)別MNIST手寫數(shù)字的神經(jīng)網(wǎng)絡(luò)實(shí)例。本章將給大家介紹如何安裝Keras、Theano和TensorFlow,并逐步生成一個(gè)可實(shí)際運(yùn)行的環(huán)境,以使大家在短時(shí)間內(nèi)快速地由直觀印象進(jìn)入到可運(yùn)行的神經(jīng)網(wǎng)絡(luò)世界。我們還將介紹基于docker容器架構(gòu)下的安裝方法,以及谷歌GCP、亞馬遜AWS和微軟Azure云環(huán)境下的安裝。此外,我們會(huì)概括性介紹Keras的API,以及一些常見的使用操作,如加載和保存神經(jīng)網(wǎng)絡(luò)架構(gòu)和權(quán)重、早期停止、歷史信息保存、檢查點(diǎn),以及與TensorBoard和Quiver的交互等。我們開始吧。到本章結(jié)束,我們將涵蓋以下主題:安裝和配置KerasKeras的架構(gòu)2.1安裝Keras下面的部分,我們會(huì)演示如何在多個(gè)不同的平臺(tái)上安裝Keras。2.1.1第1步——安裝依賴項(xiàng)首先,我們安裝numpy包,這個(gè)包為大型多維數(shù)組和矩陣以及高級(jí)數(shù)學(xué)函數(shù)提供了支持。然后,我們來(lái)安裝用于科學(xué)計(jì)算的scipy庫(kù)。之后,比較合適的是安裝scikit-learn包,這個(gè)包被認(rèn)為是Python用于機(jī)器學(xué)習(xí)的“瑞士軍刀”。這里,我們用它來(lái)做數(shù)據(jù)探索。作為可選項(xiàng),我們還可以安裝用于圖像處理的pillow包以及Keras模型存儲(chǔ)中用于數(shù)據(jù)序列化的h5py包。單一的命令行就可以完成所有安裝。或者,我們也可以安裝AnacondaPython,它會(huì)自動(dòng)安裝numpy、scipy、scikit-learn、h5py、pillow以及許多其他用于科學(xué)計(jì)算的包(更多信息,請(qǐng)參考《BatchNormalization:AcceleratingDeepNetworkTrainingbyReducingInternalCovariateShift》,作者S.Ioffe和C.Szegedy,arX/abs/1502.03167,2015)。你可以在AnacondaPython官方站點(diǎn)找到這些包。圖2.1展示了如何為我們的機(jī)器安裝這些包。圖第2步——安裝Theano我們可以借助pip安裝Theano,如圖2.2所示。圖第3步——安裝TensorFlow現(xiàn)在我們按照TensorFlow網(wǎng)站的指南來(lái)安裝TensorFlow。我們?nèi)詫⒔柚鷓ip來(lái)安裝正確的包,如圖2.3所示。例如,如果我們需要使用GPU,找到合適的包就很重要。圖第4步——安裝Keras現(xiàn)在,我們可以簡(jiǎn)單地安裝Keras,然后來(lái)測(cè)試安裝好的環(huán)境,方法相當(dāng)簡(jiǎn)單,我們還是用pip,如圖2.4所示。圖第5步——測(cè)試Theano、TensorFlow和Keras現(xiàn)在來(lái)測(cè)試環(huán)境。我們先看看如何在Theano中定義sigmoid函數(shù),如你所見,非常簡(jiǎn)單,我們只需寫下數(shù)據(jù)公式,并按矩陣元素作函數(shù)計(jì)算即可。打開Pythonshell,編寫圖2.5所示的代碼并運(yùn)行就會(huì)得到結(jié)果。圖2.5現(xiàn)在Therno好了,我們來(lái)測(cè)試一下TensorFlow,如圖2.6所示,我們簡(jiǎn)單地導(dǎo)入MNIST數(shù)據(jù)集,在第1章“神經(jīng)網(wǎng)絡(luò)基礎(chǔ)”中我們已經(jīng)看到一些可運(yùn)行的Keras網(wǎng)絡(luò)實(shí)例。圖2.62.2配置KerasKeras有一個(gè)最小配置集文件。我們?cè)趘i中把這個(gè)文件打開,參數(shù)都很簡(jiǎn)單,如表2.1所示。表2.1參數(shù)取值image_dim_ordering值為tf代表TensorFlow的圖像順序,值代表th代表Theano的圖像順序epsilon計(jì)算中使用的epsilon值floatx可為float32或float64backend可為tensorflow或theano參數(shù)image_dim_ordering的取值看起來(lái)有點(diǎn)不太直觀,值為th時(shí),代表了圖像通道順序?yàn)椋ㄉ睢?、高),取值為tf時(shí)順序?yàn)椋▽?、高、深)。圖2.7所示為我們本機(jī)的默認(rèn)參數(shù)配置。圖2.7如果你安裝的TensorFlow版本啟用了GPU,那么當(dāng)TensorFlow被設(shè)置為backend的時(shí)候,Keras就會(huì)自動(dòng)使用你配置好的GPU。2.3在Docker上安裝Keras開始使用TensorFlow和Keras的比較簡(jiǎn)單的方式是在Docker容器中運(yùn)行。一個(gè)比較便捷的方案是使用社區(qū)創(chuàng)建的預(yù)定義的Docker深度學(xué)習(xí)鏡像,它包括了所有流行的深度學(xué)習(xí)框架(TensorFlow、Theano、Torch、Caffe等)。代碼文件請(qǐng)參考GitHub庫(kù):/saiprashanths/dl-docker。假設(shè)你已經(jīng)安裝了Docker并運(yùn)行起來(lái)(更多信息,請(qǐng)參考Docker官網(wǎng)),安裝非常簡(jiǎn)單,如圖2.8所示。圖2.8我們從Git獲取鏡像后的編譯過(guò)程如圖2.9所示。圖2.9如圖2.10所示,我們看一下如何運(yùn)行它。圖2.10我們可以從容器內(nèi)激活對(duì)JupyterNotebooks的支持(更多信息,請(qǐng)參考Jupyter官網(wǎng)),如圖2.11所示。圖2.11直接通過(guò)宿主機(jī)端口訪問,如圖2.12所示。圖2.12也可以通過(guò)圖2.13所示的命令訪問TensorBoard,我們將在下一節(jié)介紹這個(gè)命令。圖2.13運(yùn)行完上面的命令后,你將被重定向到以下頁(yè)面,如圖2.14所示。圖2.142.4在谷歌CloudML上安裝Keras在谷歌Cloud上安裝Keras非常簡(jiǎn)單。首先,我們要安裝谷歌Cloud(安裝文件下載,請(qǐng)參考/sdk/),它是谷歌CloudPlatform的一個(gè)命令行界面;然后,我們就可以使用CloudML,一個(gè)可以讓我們很容易通過(guò)TensorFlow構(gòu)建機(jī)器學(xué)習(xí)模型的托管服務(wù)。在使用Keras之前,讓我們利用谷歌Cloud上的TensorFlow訓(xùn)練來(lái)自GitHub的MNIST可用實(shí)例。代碼是本地的,訓(xùn)練在Cloud端進(jìn)行,如圖2.15所示。圖2.15如圖2.16所示,你可以看見如何運(yùn)行一個(gè)訓(xùn)練會(huì)話。圖2.16我們可以通過(guò)TensorFlow查看交叉熵如何隨迭代遞減,如圖2.17所示。圖2.17如圖2.18所示,我們可以看到交叉熵的變化趨勢(shì)。圖2.18現(xiàn)在,我們想在TensorFlow上應(yīng)用Keras,我們只需從PyPI上下載Keras源文件(下載請(qǐng)參考https://pypi.P/pypi/Keras/1.2.0或更新版本),并直接把Keras作為CloudML的解決方案包來(lái)使用即可,如圖2.19所示。圖2.19trainer.task2.py是一個(gè)實(shí)例腳本,如下所示。fromkeras.applications.vgg16importVGG16
fromkeras.modelsimportModel
fromkeras.preprocessingimportimage
fromkeras.applications.vgg16importpreprocess_input
importnumpyasnp
#預(yù)編譯并預(yù)訓(xùn)練VGG16模型
base_model=VGG16(weights='imagenet',include_top=True)
fori,layerinenumerate(base_model.layers):
print(i,,layer.output_shape)
2.5在亞馬遜AWS上安裝Keras在Amazon云上安裝TensorFlow和Keras非常簡(jiǎn)單。實(shí)際上,我們可以借助一個(gè)預(yù)編譯好并且開源、免費(fèi)的叫作TFAMI.v3的AMI來(lái)完成(更多信息,請(qǐng)參考https:///ritchieng/tensorflow-aws-ami),如圖2.20所示。圖2.20AMI在5分鐘內(nèi)就可以啟用一個(gè)搭建好的TensorFlow環(huán)境,并支持TensorFlow、Keras、OpenAIGym,以及所有的依賴項(xiàng)。截至2017年1月,AMI支持下列技術(shù):TensorFlow0.12Keras1.1.0TensorLayer1.2.7CUDA8.0CuDNN5.1Python2.7Ubuntu16.04此外,TFAMI.v3可以運(yùn)行在P2計(jì)算實(shí)例上(更多信息,請(qǐng)參考亞馬遜AWS官網(wǎng)),如圖2.21所示。圖2.21P2實(shí)例的一些特征如下:IntelXeonE5-2686v4(Broadwell)處理器NVIDIAK80GPU,每個(gè)GPU有2496個(gè)并發(fā)核心和12GB內(nèi)存支持端到端的GPU通信提供增強(qiáng)的20Gbit/s的聚合網(wǎng)絡(luò)帶寬TFAMI.v3也能運(yùn)行在G2計(jì)算實(shí)例上(更多信息,請(qǐng)參考亞馬遜AWS官網(wǎng)),G2實(shí)例的一些特征如下:IntelXeonE5-2670(SandyBridge)處理器NVIDIAGPU,每個(gè)GPU有1536個(gè)CUDA核心和4GB的顯存2.6在微軟Azure上安裝Keras在Azure上安裝Keras的一種方式是通過(guò)安裝Docker的支持,并獲得已容器化的TensorFlow和Keras版本。我們也可以通過(guò)網(wǎng)上找到一套用Docker安裝TensorFlow和Keras的說(shuō)明,但本質(zhì)上和我們前面小節(jié)介紹過(guò)的一樣(更多信息,請(qǐng)參考https://blogs./uk_faculty_connection/2016/09/26/tensorflow-on-docker-with-microsoft-azure/)。如果只用Theano作唯一后端,那么你只需要點(diǎn)一下鼠標(biāo),從Cortana智能庫(kù)下載一個(gè)預(yù)編譯包就能運(yùn)行Keras了(更多信息,請(qǐng)參考/Experiment/Theano-Keras-1)。下面的例子演示了如何把Theano和Keras作為一個(gè)ZIP文件直接導(dǎo)入AzureML,并用它們執(zhí)行Python腳本模塊。這個(gè)例子起因于HaiNing,它內(nèi)部是通過(guò)azureml_main()方法運(yùn)行Keras代碼的。#腳本必須包含azureml_main函數(shù)
#它是模塊兒的入口
#導(dǎo)入要用到的庫(kù)
importpandasaspd
importtheano
importtheano.tensorasT
fromtheanoimportfunction
fromkeras.modelsimportSequential
fromkeras.layersimportDense,Activation
importnumpyasnp
#入口函數(shù)最多可包含兩個(gè)輸入?yún)?shù):
#Param<dataframe1>:apandas.DataFrame
#Param<dataframe2>:apandas.DataFrame
defazureml_main(dataframe1=None,dataframe2=None):
#這里開始執(zhí)行邏輯代碼
#print('Inputpandas.DataFrame#1:rnrn{0}'.format(dataframe1))
#如果三方輸入的zip文件已連接,將其解壓縮到目錄".ScriptBundle"。這個(gè)目錄會(huì)加入到sys.path。因此,如果你的zip文件中包含Python代碼文件mymodule.py,可以使用importmymodule導(dǎo)入
model=Sequential()
model.add(Dense(1,input_dim=784,activation="relu"))
pile(optimizer='rmsprop',loss='binary_crossentropy',
metrics=['accuracy'])
data=np.random.random((1000,784))
labels=np.random.randint(2,size=(1000,1))
model.fit(data,labels,nb_epoch=10,batch_size=32)
model.evaluate(data,labels)
returndataframe1,
圖2.22所示是一個(gè)通過(guò)微軟AzureML運(yùn)行Theano和Keras的例子。圖2.222.7KerasAPIKeras是一個(gè)模塊化、最小化并且非常容易擴(kuò)展的架構(gòu),它的開發(fā)者FrancoisChollet說(shuō):“當(dāng)時(shí)開發(fā)這個(gè)庫(kù)的目的是為了快速的實(shí)驗(yàn),能夠在最短的時(shí)間里把想法轉(zhuǎn)換成結(jié)果,而這正是好的研究的關(guān)鍵。”Keras定義了運(yùn)行于TensorFlow或Theano上的高端的神經(jīng)網(wǎng)絡(luò)。其具體特點(diǎn)如下。模塊化:一個(gè)模型就是一些獨(dú)立模塊的序列化或者圖形化組合,它們就像樂高積木一樣可以聯(lián)合起來(lái)搭建神經(jīng)網(wǎng)絡(luò)。換句話說(shuō),這個(gè)庫(kù)預(yù)定義了大量的不同類型的神經(jīng)網(wǎng)絡(luò)層的實(shí)現(xiàn),如成本函數(shù)、優(yōu)化器、初始化方案、激活函數(shù),以及正則化方案等。最小化:本庫(kù)使用Python實(shí)現(xiàn),每個(gè)模塊都簡(jiǎn)短并自我描述。易擴(kuò)展性:這個(gè)庫(kù)可以擴(kuò)展出新的功能,我們將在第7章“其他深度學(xué)習(xí)模型”中講述。2.7.1從Keras架構(gòu)開始本節(jié)中,我們將看看用來(lái)定義神經(jīng)網(wǎng)絡(luò)的最重要的Keras組件。首先,我們會(huì)給出張量的定義;然后,我們討論組成預(yù)定義模塊的不同方式;最后,我們會(huì)總結(jié)最常用的部分。什么是張量Keras使用Theano或TensorFlow來(lái)進(jìn)行極高效的張量計(jì)算。到底什么是張量呢?其實(shí)張量就是一個(gè)多維矩陣。兩種后端都能夠做有效的張量符號(hào)化計(jì)算,而這正是構(gòu)建神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)組成部分。用Keras構(gòu)建模型用Keras構(gòu)建模型有兩種方式,即:序貫?zāi)P秃瘮?shù)化模型以下進(jìn)行詳細(xì)地介紹。1.序貫?zāi)P偷谝环N方法就是序列化的組成,類似堆?;蜿?duì)列,我們把不同的預(yù)定義模型按照線性的管道層放到一起。在第1章“神經(jīng)網(wǎng)絡(luò)基礎(chǔ)”中,我們講到過(guò)幾個(gè)序列化管道的例子。舉個(gè)例子:model=Sequential()
model.add(Dense(N_HIDDEN,input_shape=(784,)))
model.add(Activation('relu'))
model.add(Dropout(DROPOUT))
model.add(Dense(N_HIDDEN))
model.add(Activation('relu'))
model.add(Dropout(DROPOUT))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
model.summary()
2.函數(shù)化模型第二種構(gòu)造模塊的方法是通過(guò)函數(shù)API。這種方法可以定義復(fù)雜的模型,如有向無(wú)環(huán)圖、共享層模型、多輸出模型等。在第7章“其他深度學(xué)習(xí)模型”中我們會(huì)看到這樣的例子。2.7.2預(yù)定義神經(jīng)網(wǎng)絡(luò)層概述Keras預(yù)定義了大量的神經(jīng)網(wǎng)絡(luò)層,我們來(lái)看一下最常使用的部分,并且看看哪些在接下來(lái)的章節(jié)中會(huì)較多用到。常規(guī)的dense層一個(gè)dense的模型就是一個(gè)全連接的模型。我們?cè)诘?章“神經(jīng)網(wǎng)絡(luò)基礎(chǔ)”中已經(jīng)看到過(guò)這樣的例子。下面是參數(shù)定義的原型:keras.layers.core.Dense(units,activation=None,use_bias=True,
kernel_initializer='glorot_uniform',bias_initializer='zeros',
kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,
kernel_constraint=None,bias_constraint=None)
循環(huán)神經(jīng)網(wǎng)絡(luò):簡(jiǎn)單RNN、LSTM和GRU循環(huán)神經(jīng)網(wǎng)絡(luò)(RecurrentNeuralNetwork,RNN)是一類利用了輸入內(nèi)容的有序化特性的神經(jīng)網(wǎng)絡(luò)。這樣的輸入可以是一段文本、一段演說(shuō)、時(shí)間序列或者其他任何序列中元素對(duì)其之前的元素有依賴的內(nèi)容。我們將在第6章“循環(huán)神經(jīng)網(wǎng)絡(luò)——RNN”中討論SimpleRNN、LSTM和GRU這3種循環(huán)神經(jīng)網(wǎng)絡(luò)。下面是這些參數(shù)定義的原型。keras.layers.recurrent.Recurrent(return_sequences=False,
go_backwards=False,stateful=False,unroll=False,implementation=0)
keras.layers.recurrent.SimpleRNN(units,activation='tanh',use_bias=True,
kernel_initializer='glorot_uniform',recurrent_initializer='orthogonal',
bias_initializer='zeros',kernel_regularizer=None,
recurrent_regularizer=None,bias_regularizer=None,
activity_regularizer=None,kernel_constraint=None,
recurrent_constraint=None,bias_constraint=None,dropout=0.0,
recurrent_dropout=0.0)
keras.layers.recurrent.GRU(units,activation='tanh',
recurrent_activation='hard_sigmoid',use_bias=True,
kernel_initializer='glorot_uniform',recurrent_initializer='orthogonal',
bias_initializer='zeros',kernel_regularizer=None,
recurrent_regularizer=None,bias_regularizer=None,
activity_regularizer=None,kernel_constraint=None,
recurrent_constraint=None,bias_constraint=None,dropout=0.0,
recurrent_dropout=0.0)
keras.layers.recurrent.LSTM(units,activation='tanh',
recurrent_activation='hard_sigmoid',use_bias=True,
kernel_initializer='glorot_uniform',recurrent_initializer='orthogonal',
bias_initializer='zeros',unit_forget_bias=True,kernel_regularizer=None,
recurrent_regularizer=None,bias_regularizer=None,
activity_regularizer=None,kernel_constraint=None,
recurr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《電話溝通科頓》課件
- 移動(dòng)支付系統(tǒng)漏洞挖掘與修復(fù)-洞察分析
- 星系早期形成理論-洞察分析
- 虛擬現(xiàn)實(shí)游戲教育應(yīng)用-洞察分析
- 習(xí)慣性脫位微創(chuàng)手術(shù)并發(fā)癥分析-洞察分析
- 游戲直播平臺(tái)競(jìng)爭(zhēng)策略-洞察分析
- 農(nóng)村網(wǎng)格員先進(jìn)事跡(6篇)
- 新聞?wù)鎸?shí)性與倫理考量-洞察分析
- 虛擬協(xié)作空間設(shè)計(jì)-洞察分析
- 移植后心理護(hù)理路徑構(gòu)建-洞察分析
- 2024秋期國(guó)家開放大學(xué)專科《社會(huì)調(diào)查研究與方法》一平臺(tái)在線形考(形成性考核一至四)試題及答案
- 高中數(shù)學(xué)單元教學(xué)設(shè)計(jì)范文(5篇)
- 【人教版】《勞動(dòng)教育》五上 勞動(dòng)項(xiàng)目五《設(shè)計(jì)制作海報(bào)》課件
- GB/T 22517.2-2024體育場(chǎng)地使用要求及檢驗(yàn)方法第2部分:游泳場(chǎng)地
- 2024-2030年生命科學(xué)中的工業(yè)自動(dòng)化行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2024年江蘇蘇州市事業(yè)單位專業(yè)化青年人才定崗特選444人歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- Unit3 Amazing Animals(教學(xué)設(shè)計(jì))-2024-2025學(xué)年人教PEP(2024)三年級(jí)上冊(cè)
- 一年級(jí)心理健康課件生命真美好蘇科版
- 10以內(nèi)連加減口算練習(xí)題完整版89
- GB/T 44460-2024消費(fèi)品質(zhì)量分級(jí)導(dǎo)則衛(wèi)生潔具
- 2024合同模板合伙開公司合同
評(píng)論
0/150
提交評(píng)論