??構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)
?激活函數(shù)
??Encog持久化
?在代碼里使用Encog Analyst
這章將展示用Encog怎樣構(gòu)造前饋與簡單遞歸神經(jīng)網(wǎng)絡(luò),以及在最后部分怎樣保存這些神經(jīng)網(wǎng)絡(luò)污桦。創(chuàng)建神經(jīng)網(wǎng)絡(luò)類型使用BasicNetwork和BasicLayer這兩個(gè)類桶良,除了這兩個(gè)類龄减,還使用了激活函數(shù),激活函數(shù)的作用也將討論奥务。
考慮到神經(jīng)網(wǎng)絡(luò)需要花費(fèi)大量時(shí)間去訓(xùn)練,因此保存你的神經(jīng)網(wǎng)絡(luò)是很重要的抒抬,Encog神經(jīng)網(wǎng)絡(luò)能夠使用java內(nèi)置的序列化來持久化马篮,這種持久性能夠通過寫入神經(jīng)網(wǎng)絡(luò)的EG文件來實(shí)現(xiàn)映之,這是一種跨平臺的文本文件拦焚,這章將介紹這兩種持久化方式。
在上一章中杠输,使用EncogAnalyst來自動規(guī)范化數(shù)據(jù)赎败,EncogAnalyst也能夠自動化創(chuàng)建基于CSV數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)。這章將展示怎樣從代碼中使用Encog?Analyst創(chuàng)建神經(jīng)網(wǎng)絡(luò)蠢甲。
4.1構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)
能夠使用BasicLayer和BasicNetwork對象創(chuàng)建一個(gè)簡單的神經(jīng)網(wǎng)絡(luò)僵刮,以下代碼創(chuàng)建了幾個(gè)BasicLayer對象,默認(rèn)為雙曲正切激活函數(shù)鹦牛。
這個(gè)神經(jīng)網(wǎng)絡(luò)將有兩個(gè)神經(jīng)元的輸入層搞糕,三個(gè)神經(jīng)元的隱藏層和一個(gè)單一神經(jīng)元的輸出層,要使用除了雙曲正切函數(shù)以外的激活函數(shù)曼追,可以使用以下類似的代碼:
Sigmoid激活函數(shù)通過調(diào)用AddLayer傳遞給隱藏層和輸出層窍仰,True值指定這個(gè)BasicLayer應(yīng)該有一個(gè)偏執(zhí)神經(jīng)元,輸出層沒有偏執(zhí)神經(jīng)元礼殊,以及輸入層沒有激活函數(shù)驹吮,這是因?yàn)槠珗?zhí)神經(jīng)元影響下一層,以及激活函數(shù)影響來自前一層的數(shù)據(jù)晶伦。
除非Encog使用在一些實(shí)驗(yàn)碟狞,否則總是需要使用一個(gè)偏執(zhí)神經(jīng)元,偏執(zhí)神經(jīng)元允許激活函數(shù)轉(zhuǎn)移原點(diǎn)零點(diǎn)婚陪,這使得當(dāng)輸入不是0的時(shí)候偏執(zhí)神經(jīng)元允許生成一個(gè)0值族沃,以下URL提供了更多關(guān)于偏執(zhí)神經(jīng)元重要的數(shù)學(xué)原理:
http://www.heatonresearch.com/wiki/Bias
激活函數(shù)附加到層以及用來縮放來自一個(gè)層的數(shù)據(jù),Encog將層的激活函數(shù)應(yīng)用到此層將要輸出的數(shù)據(jù)上。如果在BasicLayer中沒有指定激活函數(shù)脆淹,默認(rèn)使用雙曲正切函數(shù)智润。
還可以創(chuàng)建上下文層,上下文層能夠使用來創(chuàng)建一個(gè)Elman或者Jordan樣式的神經(jīng)網(wǎng)絡(luò)未辆,以下代碼能夠使用來創(chuàng)建一個(gè)Elman神經(jīng)網(wǎng)絡(luò)窟绷。
注意hidden.setContextFedBy這行,這里創(chuàng)建一個(gè)從輸出層到隱藏層的上下文鏈接咐柜,隱藏層總是傳遞上一次迭代的輸出兼蜈,這是一個(gè)創(chuàng)建Elman樣式的神經(jīng)網(wǎng)絡(luò),Elman和Jordan網(wǎng)絡(luò)將在第七章介紹拙友。
4.2激活函數(shù)的作用
上一節(jié)介紹了怎樣分配激活函數(shù)給層为狸,許多神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu)使用激活函數(shù)來縮放層的輸出,Encog提供大量不同的激活函數(shù)能夠使用來構(gòu)造神經(jīng)網(wǎng)絡(luò)遗契,下一節(jié)將介紹激活函數(shù)辐棒。
激活函數(shù)附加到層以及用來縮放來自一個(gè)層的數(shù)據(jù),Encog層的激活函數(shù)適用于輸出的數(shù)據(jù)牍蜂。如果沒有為BasicLayer指定一個(gè)激活函數(shù)漾根,將使用默認(rèn)的雙曲正切激活函數(shù),所有激活函數(shù)的類必須實(shí)現(xiàn)ActivationFunction接口鲫竞。
激活函數(shù)在訓(xùn)練神經(jīng)網(wǎng)絡(luò)任務(wù)中起到了非常重要的作用辐怕,傳播訓(xùn)練,這個(gè)將在下一章介紹从绘,對于傳播訓(xùn)練寄疏,激活函數(shù)要求有一個(gè)有效的導(dǎo)數(shù),并非所有的激活函數(shù)都有有效的導(dǎo)數(shù)僵井,確定一個(gè)激活函數(shù)有一個(gè)導(dǎo)數(shù)也許是選擇一個(gè)激活函數(shù)的重要因素陕截。
4.3?Encog的激活函數(shù)
下一節(jié)將介紹encog的每一個(gè)激活函數(shù),選擇一個(gè)激活函數(shù)這里有幾個(gè)因素要考慮批什,首先农曲,一個(gè)很重要的是要考慮如何使用神經(jīng)網(wǎng)絡(luò)類型決定所需的激活功能。第二渊季,考慮神經(jīng)網(wǎng)絡(luò)使用傳播訓(xùn)練的必要性朋蔫,傳播訓(xùn)練要求激活函數(shù)提供一個(gè)導(dǎo)數(shù)。最終却汉,考慮使用的數(shù)值范圍驯妄,一些激活函數(shù)僅僅處理正值或者特定范圍的數(shù)值。
4.3.1 ActivationBiPolar?
ActivationBiPolar激活函數(shù)使用要求為雙極值的神經(jīng)網(wǎng)絡(luò)合砂,雙極值的值為true或者是false這兩種之一青扔,雙極值的1代表為true,?雙極值的-1代表為false,?雙極激活函數(shù)確保了傳遞給它的任何值都為1或者是-1。雙極激活函數(shù)代碼如下:
如上所示,這個(gè)激活函數(shù)的輸出僅限為1或者是-1微猖。這種激活函數(shù)是用于神經(jīng)網(wǎng)絡(luò)需要從一層到另一層雙極輸出谈息。這個(gè)雙極值它沒有導(dǎo)數(shù)函數(shù),因此這個(gè)激活函數(shù)不能使用于傳播訓(xùn)練凛剥。
?
4.3.2 ActivationCompetitive
ActivationCompetitive函數(shù)用于迫使只有一組神經(jīng)元獲勝侠仇, 獲勝者是產(chǎn)出最高的神經(jīng)元群。每個(gè)神經(jīng)元的輸出被保存在傳遞給這個(gè)函數(shù)的數(shù)組中犁珠,獲勝神經(jīng)元組的大小是可定義的逻炊。函數(shù)首先決定獲勝者。所有非獲勝神經(jīng)元將被設(shè)置為0犁享。獲獎?wù)叨加邢嗤闹涤嗨兀@是獲勝產(chǎn)出總和的一個(gè)劃分。
這個(gè)函數(shù)首先創(chuàng)建了一個(gè)數(shù)組炊昆,將跟蹤每個(gè)神經(jīng)元是否已經(jīng)被選為獲勝者之一桨吊。獲勝者的數(shù)量也計(jì)算在內(nèi):
首先,循環(huán)maxWiners多次已發(fā)現(xiàn)獲勝者的數(shù)量:
現(xiàn)在凤巨,獲勝者必須確定视乐,循環(huán)所有神經(jīng)網(wǎng)輸出已找到最大的輸出:
如果這個(gè)神經(jīng)元沒有獲勝,它已經(jīng)是最大的輸出以及沒有其他神經(jīng)元比這個(gè)更高磅甩,那這可能是一個(gè)獲勝者:
保留被發(fā)現(xiàn)的獲勝者的總和炊林,并標(biāo)記這個(gè)神經(jīng)元為獲勝者,把它標(biāo)記為勝利者將防止它在此被選中卷要。獲勝者產(chǎn)出的總和最終將在優(yōu)勝者中分配。
現(xiàn)在確定了獲勝者的正確數(shù)量独榴,必須調(diào)整獲勝者和非獲勝者的值僧叉。所有的非獲勝者將設(shè)置為0,獲勝者將分享所有獲勝者的值總和棺榔。
這類激活函數(shù)能夠用在競爭型學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)瓶堕,例如自組織映射,這個(gè)激活函數(shù)沒有導(dǎo)數(shù)症歇,因此它不能用于傳播訓(xùn)練郎笆。
?
4.3.3 ActivationLinear
ActivationLinear函數(shù)實(shí)際上沒有激活功能,它簡單實(shí)現(xiàn)了線性函數(shù)忘晤,線性函數(shù)如下公式4.1所示:
圖4.1顯示了線性函數(shù)的簡單圖像:
線性激活函數(shù)的java實(shí)現(xiàn)非常簡單宛蚓,它什么也不做:
線性函數(shù)主要使用在那些沒有激活函數(shù)的特定神經(jīng)網(wǎng)絡(luò)類型,例如自組織映射设塔,線性激活函數(shù)有一個(gè)常數(shù)導(dǎo)數(shù)凄吏,因此他能夠使用于傳播訓(xùn)練,傳播訓(xùn)練前饋神經(jīng)網(wǎng)絡(luò)的輸出層有時(shí)使用線性層。
?
4.3.4 ActivationLOG
ActivationLog激活函數(shù)使用的是log函數(shù)算法痕钢,以下顯示了這個(gè)激活函數(shù)的計(jì)算:
產(chǎn)生的這條曲線類似雙曲正切激活函數(shù)图柏,那個(gè)將在本章后面討論。圖4.2顯示了對數(shù)激活函數(shù)的圖像任连。
對數(shù)激活函數(shù)能夠使用在防止飽和蚤吹。一個(gè)神經(jīng)元的隱藏節(jié)點(diǎn)被認(rèn)為過飽和,在給定的一組輸入時(shí)候随抠,輸出在大多數(shù)情況下大約為1或-1距辆。這能夠顯著放慢訓(xùn)練,當(dāng)選擇雙曲正切函數(shù)訓(xùn)練不成功的時(shí)候暮刃,這個(gè)對數(shù)激活函數(shù)是一個(gè)合適的選擇跨算。
正如圖4.2所示,對數(shù)激活函數(shù)由正和負(fù)兩種值椭懊,這意味著它可以使用于那些期望需要負(fù)值輸出的神經(jīng)網(wǎng)絡(luò)诸蚕,一些激活函數(shù),例如sigmoid激活函數(shù)僅僅只產(chǎn)生正的輸出氧猬,對數(shù)激活函數(shù)有一個(gè)導(dǎo)數(shù)背犯,因此它能夠使用于傳播訓(xùn)練。
?
4.3.5 ActivationSigmoid
ActivationSigmoid激活函數(shù)應(yīng)該僅僅使用于當(dāng)期望輸出為正值的時(shí)候盅抚,因?yàn)锳ctivationSigmoid激活函數(shù)僅僅產(chǎn)生正的輸出漠魏。ActiviationSigmoid激活函數(shù)的方程式如下所示:
ActivationSigmoid函數(shù)將負(fù)的范圍變?yōu)檎姆秶H鐖D4.3所示妄均,顯示了sigmoid函數(shù)的圖像:
ActivationSigmoid函數(shù)是前饋和簡單遞歸神經(jīng)網(wǎng)絡(luò)很常見的一個(gè)選擇柱锹。然而,非常必要的是訓(xùn)練數(shù)據(jù)不期望負(fù)的輸出丰包,如果要求有負(fù)的輸出禁熏,雙曲正切激活函數(shù)也許是一個(gè)最好的解決方式。
?
4.3.6 ActivationSoftMax
ActivationSoftMax激活函數(shù)將縮放所有的輸入值讓所有之和等于1邑彪,ActivationSoftMax有時(shí)用于一個(gè)隱藏層的激活函數(shù)瞧毙。
激活函數(shù)從所有神經(jīng)元輸出的自然指數(shù)相加開始:
然后,每個(gè)神經(jīng)元的輸出根據(jù)這個(gè)和寄症,由此產(chǎn)生總和為1?的輸出:
ActivationSoftMax通常用于神經(jīng)網(wǎng)絡(luò)的輸出層分類宙彪。
?
4.3.7 ActivationTANH
ActivationTANH激活函數(shù)使用雙曲正切函數(shù),雙曲正切函數(shù)也許是最常用的激活函數(shù)有巧,因?yàn)樗姓?fù)兩個(gè)范圍释漆,雙曲正切函數(shù)是Encog默認(rèn)的激活函數(shù),雙曲正切函數(shù)的公式如下公式4.3所示:
圖4.4顯示的雙曲正切函數(shù)圖像可以看到雙曲正切激活函數(shù)事實(shí)上接受正負(fù)兩個(gè)值剪决。
雙曲正切函數(shù)在前饋和簡單遞歸神經(jīng)網(wǎng)絡(luò)中是非常常用的選擇灵汪。雙曲正切函數(shù)有一個(gè)導(dǎo)數(shù)檀训,因此他能夠用于傳播訓(xùn)練。
4.4?Encog持久化
訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)需要花費(fèi)相當(dāng)長的時(shí)間享言,重要的是采取措施保證你的工作在網(wǎng)絡(luò)訓(xùn)練完成后保存下來峻凫,Encog對于數(shù)據(jù)的保存提供了幾種方式,與兩種最主要的存儲Encog數(shù)據(jù)對象的方式览露,Encog提供了基于文件的持久化或者是java自身的持久化荧琼。
Java提供自己序列化對象的方式,稱為java序列化差牛,java序列化允許大量不同的對象類型寫入到一個(gè)流命锄,例如磁盤文件,java序列化Encog和序列化其他java對象一樣偏化,每一個(gè)重要的Encog對象支持序列化實(shí)現(xiàn)Serializable接口脐恩。
Java序列化是一種存儲Encog對象的快速方式,然而侦讨,它有一些重要的局限性驶冒,創(chuàng)建java序列化文件只能用于Encog的java平臺,它們將不兼容Encog的.Net或者Encog for Silverlight平臺韵卤。進(jìn)一步骗污,java序列化直接依賴于對象,因此沈条,未來的Encog版本也許不兼容你的序列化文件需忿。
創(chuàng)建所有Encog平臺的通用文件,考慮Encog EG格式蜡歹,EG格式文件架構(gòu)神經(jīng)網(wǎng)絡(luò)保存為文本文件屋厘,文件擴(kuò)展名為.EG。
這一章將介紹這兩種Encog持久化季稳,先開始Encog EG持久化擅这,這章將探索怎樣用一個(gè)Encog持久化文件保存一個(gè)神經(jīng)網(wǎng)絡(luò)。
4.5使用Encog EG持久化
Encog EG持久化文件是Encog原生文件格式以及存儲在外部的..EG文件景鼠,Encog Workbench使用Encog EG處理文件,這種格式能夠在不同的操作系統(tǒng)和Encog平臺之間進(jìn)行交換痹扇。這是選擇Encog應(yīng)用的一個(gè)原因铛漓。
這一節(jié)開始看一下一個(gè)XOR示例使用Encog EG文件,最后鲫构,同樣的示例將用在java序列化浓恶。我們將開始用Encog EG持久化示例。
4.5.1?使用Encog EG持久化
使用Encog EG持久化非常簡單结笨,EncogDirectoryPersistence類用來從Encog EG文件中加載和保存對象包晰。以下是關(guān)于Encog EG持久化一個(gè)好的示例:
這個(gè)例子有兩個(gè)主要的方法組成湿镀,第一個(gè)方法,trainAndSave,?訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)以及保存到一個(gè)Encog EG文件伐憾。第二個(gè)方法勉痴,LoadAndEvaluate,?加載Encog EG文件和評價(jià)它,這證明了這個(gè)Encog EG文件保存正確树肃,main方法簡單地按順序調(diào)用這兩個(gè)方法,我們將開始檢測trainAndSave方法。
這個(gè)方法開始通過創(chuàng)建一個(gè)基本的神經(jīng)網(wǎng)絡(luò)來訓(xùn)練這個(gè)XOR運(yùn)算符冗酿。它是一個(gè)簡單三層前饋神經(jīng)網(wǎng)絡(luò)寄锐。
XOR運(yùn)算符訓(xùn)練集的創(chuàng)建包含了預(yù)期的輸出和輸入。
這個(gè)神經(jīng)網(wǎng)絡(luò)將使用彈性傳播訓(xùn)練(RPROP)
RPROP迭代執(zhí)行知道錯(cuò)誤里非常小劣像,訓(xùn)練將在下一章討論乡话,現(xiàn)在,訓(xùn)練是驗(yàn)證網(wǎng)絡(luò)重新加載后錯(cuò)誤率保持不變的一種方式耳奕。
一旦網(wǎng)絡(luò)被訓(xùn)練绑青,顯示最終的錯(cuò)誤率,想在就可以保存神經(jīng)網(wǎng)絡(luò)吮铭。
這個(gè)神經(jīng)網(wǎng)絡(luò)現(xiàn)在能保存到一個(gè)文件时迫,每一個(gè)文件僅僅保存一個(gè)Encog對象,使用EncogDirectoryPersistence類的saveObject方法谓晌。
現(xiàn)在這個(gè)Encog EG文件已創(chuàng)建掠拳,之后使用loadAndEvaluate從這個(gè)文件中加載這個(gè)神經(jīng)網(wǎng)絡(luò)以確保它仍然執(zhí)行很好。
現(xiàn)在已經(jīng)構(gòu)造這個(gè)集合纸肉,加載之前保存的已命名的網(wǎng)絡(luò)溺欧,重要的是要評估神經(jīng)網(wǎng)絡(luò)來證明他仍是訓(xùn)練有素的。要做到這點(diǎn)柏肪,為XOR運(yùn)算符創(chuàng)造一個(gè)訓(xùn)練集姐刁。
計(jì)算給定的訓(xùn)練數(shù)據(jù)的誤差。
這個(gè)錯(cuò)誤應(yīng)該和之前的神經(jīng)網(wǎng)絡(luò)保存時(shí)相同烦味。
4.6使用java序列化
還可以使用標(biāo)準(zhǔn)的java序列化與Encog神經(jīng)網(wǎng)絡(luò)訓(xùn)練集聂使。Encog EG持久性比java序列化更加靈活,然而谬俄,在某些情況下神經(jīng)網(wǎng)絡(luò)可以被保存到一個(gè)平臺獨(dú)立的二進(jìn)制文件柏靶,這個(gè)例子開始通過調(diào)用trainAndSave方法:
這個(gè)方法開始通過創(chuàng)建一個(gè)基本的神經(jīng)網(wǎng)絡(luò)去訓(xùn)練XOR運(yùn)算。它是一個(gè)簡單的例子溃论,三層前饋神經(jīng)網(wǎng)絡(luò)屎蜓。
我們將使用彈性傳播(RPROP)訓(xùn)練這個(gè)網(wǎng)絡(luò).
以下代碼通過循環(huán)迭代訓(xùn)練直到錯(cuò)誤率低于1%(<0.01).
最后顯示神經(jīng)網(wǎng)絡(luò)的錯(cuò)誤率。
可以使用普通java序列化代碼或者SerializeObject類保存網(wǎng)絡(luò)钥勋。此實(shí)用工具類提供了一個(gè)保存的方法炬转,將編寫任何一個(gè)可序列化的對象寫入到一個(gè)二進(jìn)制文件辆苔。這里的保存方法使用來保存神經(jīng)網(wǎng)絡(luò)。
現(xiàn)在這個(gè)二進(jìn)制文件已經(jīng)創(chuàng)建扼劈,之后將從這個(gè)文件中加載神經(jīng)網(wǎng)絡(luò)看是否仍然很好地執(zhí)行驻啤,這里通過loadAndEvaluate方法執(zhí)行。
SerializeObject類也提供了加載方法测僵,將從一個(gè)二進(jìn)制序列化文件讀取對象街佑。
現(xiàn)在,網(wǎng)絡(luò)加載完成捍靠,給出了誤差水平沐旨。
此錯(cuò)誤級別應(yīng)與網(wǎng)絡(luò)最初訓(xùn)練時(shí)的錯(cuò)誤級別相匹配。
4.7總結(jié)
使用BasicNetwork和BasicLayer類創(chuàng)建前饋和簡單遞歸神經(jīng)網(wǎng)絡(luò)榨婆,使用這些對象磁携,神經(jīng)網(wǎng)絡(luò)能夠被創(chuàng)建,也能使用上下文連接層良风,就像簡單遞歸神經(jīng)網(wǎng)絡(luò)谊迄,例如Elamn神經(jīng)網(wǎng)絡(luò)就是這樣創(chuàng)建的。
Encog使用激活函數(shù)縮放來自神經(jīng)網(wǎng)絡(luò)層的輸出烟央,Encog默認(rèn)將使用雙曲正切函數(shù)统诺,那是一個(gè)好的通用的目標(biāo)激活函數(shù),任何激活函數(shù)類必須實(shí)現(xiàn)ActivationFunction接口疑俭,如果激活函數(shù)要使用于傳播訓(xùn)練粮呢,這個(gè)激活函數(shù)必須要有能力計(jì)算導(dǎo)數(shù)。
ActivationBiPolar激活函數(shù)類使用一個(gè)網(wǎng)絡(luò)僅僅接受雙極值钞艇,ActivationCompetitive激活函數(shù)類使用在競爭機(jī)制的神經(jīng)網(wǎng)絡(luò)例如自組織映射啄寡,ActivationLinear激活函數(shù)類使用在不需要激活功能的時(shí)候,ActivationLOG激活函數(shù)類工作類似于ActivationTANH激活函數(shù)類哩照,除了它不總是作為一個(gè)隱藏層飽和挺物,ActivationSigmoid激活函數(shù)類類似于ActivationTANH激活函數(shù),除了僅僅返回一個(gè)正值飘弧,ActivationSoftMax激活函數(shù)類縮放輸出讓其所有之和等于1.
這章討論了怎樣使用兩種方法保存Encog對象识藤,也許使用Encog EG格式或者java序列化兩者之一保存對象。
對于保存Encog神經(jīng)網(wǎng)絡(luò)優(yōu)先使用Encog EG格式方式次伶,這些對象通過使用他們資源名字蹋岩,EG文件能在Encog支持的任何平臺互換。
Encog也允許java序列化存儲對象到磁盤或者流学少。Java序列化有太多限制性超過了Encog EG文件,因?yàn)檫@二進(jìn)制文件是直接從對象自動存儲秧骑,即使是最小的改變版确,一個(gè)Encog對象就會導(dǎo)致不兼容的文件扣囊。此外,其他平臺也沒有能力使用這個(gè)文件绒疗。
在下一章中闡述神經(jīng)網(wǎng)絡(luò)訓(xùn)練中的概念侵歇,訓(xùn)練的過程神經(jīng)網(wǎng)絡(luò)的初始權(quán)值修改為產(chǎn)生所需的輸出。這兒有幾種神經(jīng)網(wǎng)絡(luò)訓(xùn)練的方式吓蘑,下一章將介紹傳播訓(xùn)練惕虑。