麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設計 > 正文

用Java開源項目JOONE實現(xiàn)人工智能編程

2019-11-18 15:41:28
字體:
供稿:網(wǎng)友
簡介
  很少有程序員不對這里或者那里所包含的人工智能編程所吸引,然而,許多對AI感愛好的程序員很快就因其中包含的算法的復雜性而退卻。在本文中,我們將討論一個能大大簡化這種復雜性的java開源工程。
  Java面向?qū)ο蟮纳窠?jīng)網(wǎng)絡(JOONE)是一開源工程,它提供給Java程序員一個高適應性的神經(jīng)網(wǎng)絡。該JOONE工程源代碼由LGPL所保護。簡言之,這意味著源代碼是可自由使用的而且你不需要支付版稅就可以使用JOONE。JOONE可以從http://joone.sourceforge.net/處下載。
JOONE能答應你輕易地從一個Java程序中創(chuàng)建神經(jīng)網(wǎng)絡。JOONE支持許多特征,如多線程和分布式處理。這意味著JOONE能利用多處理機計算機和多臺計算機的優(yōu)勢來進行分布式處理。
  神經(jīng)網(wǎng)絡
  JOONE用Java實現(xiàn)了一個人工神經(jīng)網(wǎng)絡。一個人工神經(jīng)網(wǎng)絡試圖仿效生物學神經(jīng)網(wǎng)絡的功能--神經(jīng)網(wǎng)絡組成今天在地球上幾乎所有高等生命的大腦形式。神經(jīng)網(wǎng)絡由神經(jīng)原組成。圖1顯示了一個實際神經(jīng)原圖。

用Java開源項目JOONE實現(xiàn)人工智能編程(圖一)
圖1:一個生物學的神經(jīng)原


   從圖1中你可以看出,神經(jīng)原由一個內(nèi)核細胞和幾個長長的稱為觸角的連接器組成。神經(jīng)原之間依靠這些觸角進行連接。無論是生物學的還是人工的神經(jīng)網(wǎng)絡,都通過觸角把信號從一個神經(jīng)原傳遞到另一個神經(jīng)原來工作。


   使用JOONE
   在這篇文章中,你將看到一個簡單的怎樣使用JOONE的實例。神經(jīng)網(wǎng)絡題目涉及廣泛并覆蓋許多不同的應用領域。在本文中,我們將展示給你怎樣使用JOONE來解決一個很簡單的模式識別問題。模式識別是神經(jīng)網(wǎng)絡中的最普遍的應用之一。
   模式識別提供給神經(jīng)網(wǎng)絡一種模式,判定是否該神經(jīng)網(wǎng)絡能夠識別出該模式。這種模式應該能夠在某種程度上被扭曲而該神經(jīng)網(wǎng)絡仍然能夠識別它。這很像人類識別東西(如一個交通標志)的能力。人類應該能夠識別在下雨天,晴天或者晚上的交通標志。即使這些圖像看上去可能相當不同,但人類的大腦仍能夠判定出它們是一樣的圖像。
   當進行JOONE編程時,你一般要使用兩種類型的對象。你要使用神經(jīng)原層對象,用于描述一層的一個或多個的具有相似特征的神經(jīng)原。神經(jīng)網(wǎng)絡經(jīng)常有一層或兩層神經(jīng)元。這些神經(jīng)元層通過觸角聯(lián)系在一起。這些觸角把這種待識別的模式,從一個神經(jīng)元層傳輸?shù)搅硪粋€神經(jīng)元層。
   觸角不僅把這種模式從一個神經(jīng)元層傳輸?shù)搅硪粋€神經(jīng)元層。觸角還將生成一些指向這種模式的元素的斜線。這些斜線將導致這種模式的某些元素在被傳輸?shù)较乱粋€神經(jīng)元層時不如通過其它方式傳遞更有效些。這些斜線通常稱為權重,它們形成神經(jīng)網(wǎng)絡的存儲系統(tǒng)。通過調(diào)整存儲在觸角中的這些權重,可以更改神經(jīng)網(wǎng)絡的行為。
   觸角在JOONE中還承擔著另外一個角色。在JOONE中,可以把觸角看作是數(shù)據(jù)導管。正如觸角把模式從一個神經(jīng)元層傳輸?shù)搅硪粋€神經(jīng)元層,指定版本的觸角用于把模式傳入和傳出神經(jīng)網(wǎng)絡。下面將給你展示一個簡單的單層的神經(jīng)網(wǎng)絡是怎樣被構建并進行模式識別的。

練習神經(jīng)網(wǎng)絡
   為實現(xiàn)本文的目的,我們將指導JOONE去識別一個很簡單的模式。在這種模式中,我們將考察一個二進制的布爾操作,例如XOR。這個XOR操作的真值表列舉如下:

X Y X XOR Y0 0 00 1 11 0 11 10


  正如你從上表中看到的,XOR運算的結果是只有當X和Y具有不同值時,結果才為真(1)。其它情況下,XOR運算結果均為假(0)。默認地,JOONE從存儲在你的系統(tǒng)中的文本文件中取得輸入。這些文本文件通過使用一種稱為FileInputSynapse的非凡觸角來讀取。為了練習XOR運算問題,你必須建立一個輸入文件-該文件包含上面顯示的數(shù)據(jù)。該文件顯示在列表1中。
  列表1:為解決XOR問題的輸入文件的內(nèi)容
0.0;0.0;0.0
0.0;1.0;1.0
1.0;0.0;1.0
1.0;1.0;0.0

  我們現(xiàn)在分析一個簡單的程序,它指導JOONE來識別XOR運算并產(chǎn)生正確的結果。我們現(xiàn)在分析練習該神經(jīng)網(wǎng)絡必須被處理的過程。練習過程包括把XOR問題提交給神經(jīng)網(wǎng)絡,然后觀察結果。假如這個結果不是所預期的,該練習算法將調(diào)整存儲在觸角中的重量。在神經(jīng)網(wǎng)絡的實際輸出和預料的輸出之間的差距稱為誤差。練習將繼續(xù)到誤差小于一個可接受值為止。這個級別通常是一個百分數(shù),如10%。我們現(xiàn)在分析必須用于練習一個神經(jīng)網(wǎng)絡的代碼。
  練習過程通過建立神經(jīng)網(wǎng)絡開始,同時也必須創(chuàng)建隱蔽的輸入層和輸出層。
// 首先,創(chuàng)造這三個層
input = new SigmoidLayer();
hidden = new SigmoidLayer();
output = new SigmoidLayer();

  每個層被使用JOONE對象SigmoidLayer創(chuàng)建。Sigmoidlayer基于自然對數(shù)生成一個輸出。JOONE還包含另外的層,而不是你可能選擇使用的S形的層類型。
  下一步,每一層被賦于一個名字。這些名字將有助于后面在調(diào)試期間識別該層。
input.setLayerName("input");
hidden.setLayerName("hidden");
output.setLayerName("output");

  現(xiàn)在必須定義每個層。我們將指定在每一層中的"行"號。該"行"號對應于這一層中的神經(jīng)原的數(shù)目。
input.setRows(2);
hidden.setRows(3);
output.setRows(1);

  從上面的代碼看出,輸入層有兩個神經(jīng)原,隱蔽層有三個隱蔽神經(jīng)原,輸出層包含一個神經(jīng)原。這對于神經(jīng)網(wǎng)絡包含兩個輸入神經(jīng)原和一個輸出神經(jīng)原是具有重要意義的,因為XOR運算符接收兩個參數(shù)而產(chǎn)生一個結果。
  為使用該神經(jīng)原層,我們也必須創(chuàng)建觸角。在本例中,我們要使用多個觸角。這些觸角用下面的代碼實現(xiàn)。
// 輸入-> 隱蔽的連接。
FullSynapse synapse_IH = new FullSynapse();
// 隱蔽-> 輸出連接。
FullSynapse synapse_HO = new FullSynapse();

  就象神經(jīng)原層的情況一樣,觸角也可能命名以有助于程序的調(diào)試。下面的代碼命名新建的觸角。
synapse_IH.setName("IH");
synapse_HO.setName("HO");

  最后,我們必須把觸角聯(lián)接到適當神經(jīng)原層。下面的代碼實現(xiàn)這一點。
// 聯(lián)接輸入層到隱蔽層
input.addOutputSynapse(synapse_IH);
hidden.addInputSynapse(synapse_IH);
// 聯(lián)接隱蔽層到輸出層
hidden.addOutputSynapse(synapse_HO);
output.addInputSynapse(synapse_HO);

  現(xiàn)在既然神經(jīng)網(wǎng)絡已被創(chuàng)建,我們必須創(chuàng)建一個用于調(diào)節(jié)該神經(jīng)網(wǎng)絡的監(jiān)視器對象。下面的代碼創(chuàng)建監(jiān)視器對象。
//創(chuàng)建監(jiān)視器對象并且設置學習參數(shù)
monitor = new Monitor();
monitor.setLearningRate(0.8);
monitor.setMomentum(0.3);

  學習速度和動力作為參數(shù)以用于指定練習的產(chǎn)生方式。JOONE利用backPRopagation學習算法。要更多了解關于學習速度或者動力的信息,你應該參考backpropagation算法。
  這個監(jiān)視器對象應該被賦值給每一個神經(jīng)原層。下面的代碼實現(xiàn)這一點。
input.setMonitor(monitor);
hidden.setMonitor(monitor);
output.setMonitor(monitor);

  就象許多Java對象本身一樣,JOONE監(jiān)視器答應聽者可以添加到它上面去。隨著練習的進行,JOONE將通知聽者有關練習進程的信息。在這個簡單的例子中,我們使用:
monitor.addNeuralNetListener(this);
  我們現(xiàn)在必須建立輸入觸角。如前所述,我們將使用一個FileInputSynapse來讀取一個磁盤文件。磁盤文件不是JOONE唯一能夠接受的輸入種類。JOONE對于不同的輸入源具有很強的靈活性。為使JOONE能夠接收其它輸入類型,你只需創(chuàng)建一個新的觸角來接受輸入。在本例中,我們將簡單地使用FileInputSynapse。FileInputSynapse首先被實例化。
inputStream = new FileInputSynapse();
  然后,必須通知FileInputSynapse要使用哪些列。列表1中顯示的文件使用了輸入數(shù)據(jù)的前兩列。下面代碼建立起前兩列用于輸入到神經(jīng)網(wǎng)絡。
// 前兩列包含輸入值
inputStream.setFirstCol(1);
inputStream.setLastCol(2);

  然后,我們必須提供輸入文件的名字,這個名字直接來源于用戶接口。然后,提供一個編輯控件用于收集輸入文件的名字。下面代碼為FileInputSynapse設置文件名。
// 這是包含輸入數(shù)據(jù)的文件名
inputStream.setFileName(inputFile.getText());

  如前所述,一個觸角僅是一個神經(jīng)原層之間的數(shù)據(jù)導管。FileInputSynapse正是這里的數(shù)據(jù)導管,通過它數(shù)據(jù)進入到神經(jīng)網(wǎng)絡。為了更輕易實現(xiàn)這點,我們必須要把FileInputSynapse加到神經(jīng)網(wǎng)絡的輸入層。這由下面一行實現(xiàn)。
input.addInputSynapse(inputStream);
  現(xiàn)在既然已經(jīng)建立起神經(jīng)網(wǎng)絡,我們必須創(chuàng)建一個練習員和一個監(jiān)視器。練習員用于練習該神經(jīng)網(wǎng)絡,因為該監(jiān)視器通過一個事先設置好的練習重復數(shù)來運行這個神經(jīng)網(wǎng)絡。對于每一次練習重復,數(shù)據(jù)被提供到神經(jīng)網(wǎng)絡,然后就可以觀察到結果。該神經(jīng)網(wǎng)絡的權重(存儲在穿梭在神經(jīng)原層之間的觸角連接中)將根據(jù)誤差作適當調(diào)整。隨著練習的進行,誤差級將下降。下列代碼建立練習員并把它依附到監(jiān)視器。
trainer = new TeachingSynapse();
trainer.setMonitor(monitor);

  你會記得列表1中提供的輸入文件包含三個列。到目前為止,我們僅僅使用了第一、二列,它們指定了到神經(jīng)網(wǎng)絡的輸入。第三列包含當提供給神經(jīng)網(wǎng)絡第一列中的數(shù)字時的期盼的輸出值。我們必須使得練習員能夠存取該列以便能確定誤差。該錯誤是神經(jīng)網(wǎng)絡的實際輸出和期盼的輸出之間的差距。下列代碼創(chuàng)建另外一個FileInputSynapse并作好預備以讀取與前面相同的輸入文件。
// 設置包含期望的響應值的文件,這由FileInputSynapse來提供
samples = new FileInputSynapse();
samples.setFileName(inputFile.getText());

  這時,我們想指向在第三列的FileInputSynapse。下列代碼實現(xiàn)了這一點,然后讓練習員使用這個FileInputSynapse。
//輸出值在文件中的第三列上
samples.setFirstCol(3);
samples.setLastCol(3);
trainer.setDesired(samples);

  最后,練習員被連結到神經(jīng)網(wǎng)絡輸出層,這將使練習員接收神經(jīng)網(wǎng)絡的輸出。
// 連接練習員到網(wǎng)絡的最后一層
output.addOutputSynapse(trainer);

  我們現(xiàn)在已為所有的層預備好后臺線程,包括練習員。
input.start();
hidden.start();
output.start();
trainer.start();

  最后,我們?yōu)榫毩曉O置一些參數(shù)。我們指定在輸入文件中共有四行,而且想練習20,000個周期,而且還在不段學習。假如你設置學習參數(shù)為false,該神經(jīng)網(wǎng)絡將簡單地處理輸入并不進行學習。我們將在下一節(jié)討論輸入處理。
monitor.setPatterns(4);
monitor.setTotCicles(20000);
monitor.setLearning(true);

  現(xiàn)在我們已經(jīng)為練習過程作好預備。調(diào)用監(jiān)視器的Go方法將在后臺啟動練習過程。
monitor.Go();
   神經(jīng)網(wǎng)絡現(xiàn)在將要被練習20,000個周期。當神經(jīng)網(wǎng)絡練習完成,誤差層應該在一個合理的低級別上。一般低于10%的誤差級是可接受的。



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产一级午夜 | 91精品国产99久久久久久 | 国产免费观看视频 | 香蕉久久久久久 | 久草在线公开视频 | 一级毛片电影院 | 久久99精品久久久久久小说 | 欧美成人一区二区三区 | 日韩精品网站在线观看 | 亚洲精品动漫在线观看 | 午夜在线视频一区二区三区 | 羞羞视频免费网站含羞草 | 久久久久成人免费 | 黄色片网站免费 | 毛片免费在线视频 | 国产福利不卡一区二区三区 | 一级免费黄视频 | 99精彩视频在线观看 | 国产18成人免费视频 | 亚洲片在线观看 | 精品久久久久久久久中文字幕 | 伊人二本二区 | 毛片一级网站 | 成人免费在线播放 | 国产一区二区三区视频免费 | 欧美另类69xxxxx 视频 | 国产青草视频在线观看视频 | 欧美日韩免费一区 | 一区二区三区欧美精品 | 日韩视频一| 欧美a∨一区二区三区久久黄 | 亚洲精品欧美在线 | 亚洲综合网站 | 久久精品亚洲一区二区三区观看模式 | 久久精品国产99久久久古代 | 黄色一级毛片免费看 | 久久99亚洲精品久久99果 | 天天干天天透 | 久久经典国产视频 | 一级国产精品一级国产精品片 | 91久久久久久 |