search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

Java能實現人工智慧嗎?

我們來進入今天的主題

JAVA 能實現人工智慧嗎?

答案當然是肯定的:必須能!

如何實現?

很少有程序員不對這裡或者那裡所包含的人工智慧編程所吸引,然而,許多對AI感興趣的程序員很快就因其中包含的演算法的複雜性而退卻。在本文中,我們將討論一個能大大簡化這種複雜性的Java開源項目。

Java實現神經網路的框架有:Joone、Encog和Neuroph,今天的文章我們主要介紹Joone這個框架。

Java面向對象的神經網路(JOONE)是一開源工程,它提供給Java程序員一個高適應性的神經網路。該JOONE工程源代碼由LGPL所保護。簡言之,這意味著源代碼是可自由使用的而且你不需要支付版稅就可以使用JOONE。

JOONE可以從處下載。

JOONE能允許你輕易地從一個Java程序中創建神經網路。JOONE支持許多特徵,如多線程和分散式處理。這意味著JOONE能利用多處理機計算機和多台計算機的優勢來進行分散式處理。

神經網路

JOONE用Java實現了一個人工神經網路。一個人工神經網路試圖仿效生物學神經網路的功能——神經網路組成今天在地球上幾乎所有高等生命的大腦形式。神經網路由神經原組成。

一個實際神經原圖:

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

使用JOONE

在這篇文章中,你將看到一個簡單的怎樣使用JOONE的實例。神經網路題目涉及廣泛並覆蓋許多不同的應用領域。在本文中,我們將展示給你怎樣使用JOONE來解決一個很簡單的模式識別問題。模式識別是神經網路中的最普遍的應用之一。

模式識別提供給神經網路一種模式,判斷是否該神經網路能夠識別出該模式。這種模式應該能夠在某種程度上被扭曲而該神經網路仍然能夠識別它。這很像人類識別東西(如一個交通標誌)的能力。人類應該能夠識別在下雨天,晴天或者晚上的交通標誌。即使這些圖像看上去可能相當不同,但人類的大腦仍能夠判斷出它們是一樣的圖像。

當進行JOONE編程時,你一般要使用兩種類型的對象。你要使用神經原層對象,用於描述一層的一個或多個的具有相似特徵的神經原。神經網路經常有一層或兩層神經元。這些神經元層通過觸角聯繫在一起。這些觸角把這種待識別的模式,從一個神經元層傳輸到另一個神經元層。

觸角不僅把這種模式從一個神經元層傳輸到另一個神經元層。觸角還將生成一些指向這種模式的元素的斜線。這些斜線將導致這種模式的某些元素在被傳輸到下一個神經元層時不如通過其它方式傳遞更有效些。這些斜線通常稱為權重,它們形成神經網路的存儲系統。通過調整存儲在觸角中的這些權重,可以更改神經網路的行為。

觸角在JOONE中還承擔著另外一個角色。在JOONE中,可以把觸角看作是數據導管。正如觸角把模式從一個神經元層傳輸到另一個神經元層,指定版本的觸角用於把模式傳入和傳出神經網路。下面將給你展示一個簡單的單層的神經網路是怎樣被構建並進行模式識別的。

訓練神經網路

為實現本文的目的,我們將指導JOONE去識別一個很簡單的模式。在這種模式中,我們將考察一個二進位的布爾操作,例如XOR(異或)。這個XOR操作的真值表列舉如下:

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

列表1:為解決XOR問題的輸入文件的內容

0.0;0.0;0.0

0.0;1.0;1.0

1.0;0.0;1.0

1.0;1.0;0.0

我們現在分析一個簡單的程序,它指導JOONE來識別XOR運算併產生正確的結果。我們現在分析訓練該神經網路必須被處理的過程。訓練過程包括把XOR問題提交給神經網路,然後觀察結果。如果這個結果不是所預期的,該訓練演算法將調整存儲在觸角中的重量。在神經網路的實際輸出和預料的輸出之間的差距稱為誤差。訓練將繼續到誤差小於一個可接受值為止。這個級別通常是一個百分數,如10%。我們現在分析必須用於訓練一個神經網路的代碼。

訓練過程通過建立神經網路開始,同時也必須創建隱蔽的輸入層和輸出層。

// 首先,創造這三個層

input = new SigmoidLayer;

hidden = new SigmoidLayer;

output = new SigmoidLayer;

每個層被使用JOONE對象SigmoidLayer創建。Sigmoidlayer基於自然對數生成一個輸出。JOONE還包含另外的層,而不是你可能選擇使用的S形的層類型。

下一步,每一層被賦於一個名字。這些名字將有助於後面在調試期間識別該層。

input.setLayerName("input");

hidden.setLayerName("hidden");

output.setLayerName("output");

現在必須定義每個層。我們將指定在每一層中的"行"號。該"行"號對應於這一層中的神經原的數目。

input.setRows(2);

hidden.setRows(3);

output.setRows(1);

從上面的代碼看出,輸入層有兩個神經原,隱蔽層有三個隱蔽神經原,輸出層包含一個神經原。這對於神經網路包含兩個輸入神經原和一個輸出神經原是具有重要意義的,因為XOR運算符接收兩個參數而產生一個結果。

為使用該神經原層,我們也必須創建觸角。在本例中,我們要使用多個觸角。這些觸角用下面的代碼實現。

// 輸入-> 隱蔽的連接。

FullSynapse synapse_IH = new FullSynapse;

// 隱蔽-> 輸出連接。

FullSynapse synapse_HO = new FullSynapse;

就象神經原層的情況一樣,觸角也可能命名以有助於程序的調試。下面的代碼命名新建的觸角。

synapse_IH.setName("IH");

synapse_HO.setName("HO");

最後,我們必須把觸角聯接到適當神經原層。下面的代碼實現這一點。

// 聯接輸入層到隱蔽層

input.addOutputSynapse(synapse_IH);

hidden.addInputSynapse(synapse_IH);

// 聯接隱蔽層到輸出層

hidden.addOutputSynapse(synapse_HO);

output.addInputSynapse(synapse_HO);

現在既然神經網路已被創建,我們必須創建一個用於調節該神經網路的監視器對象。下面的代碼創建監視器對象。

//創建監視器對象並且設置學習參數

monitor = new Monitor;

monitor.setLearningRate(0.8);

monitor.setMomentum(0.3);

學習速度和動力作為參數以用於指定訓練的產生方式。JOONE利用backpropagation學習演算法。要更多了解關於學習速度或者動力的信息,你應該參考backpropagation演算法。

這個監視器對象應該被賦值給每一個神經原層。下面的代碼實現這一點。

input.setMonitor(monitor);

hidden.setMonitor(monitor);

output.setMonitor(monitor);

就象許多Java對象本身一樣,JOONE監視器允許聽者可以添加到它上面去。隨著訓練的進行,JOONE將通知聽者有關訓練進程的信息。在這個簡單的例子中,我們使用:

monitor.addNeuralNetListener(this);

我們現在必須建立輸入觸角。如前所述,我們將使用一個FileInputSynapse來讀取一個磁碟文件。磁碟文件不是JOONE唯一能夠接受的輸入種類。JOONE對於不同的輸入源具有很強的靈活性。為使JOONE能夠接收其它輸入類型,你只需創建一個新的觸角來接受輸入。在本例中,我們將簡單地使用FileInputSynapse。FileInputSynapse首先被實例化。

inputStream = new FileInputSynapse;

然後,必須通知FileInputSynapse要使用哪些列。列表1中顯示的文件使用了輸入數據的前兩列。下面代碼建立起前兩列用於輸入到神經網路。

// 前兩列包含輸入值

inputStream.setFirstCol(1);

inputStream.setLastCol(2);

然後,我們必須提供輸入文件的名字,這個名字直接來源於用戶介面。然後,提供一個編輯控制項用於收集輸入文件的名字。下面代碼為FileInputSynapse設置文件名。

// 這是包含輸入數據的文件名

inputStream.setFileName(inputFile.getText);

如前所述,一個觸角僅是一個神經原層之間的數據導管。FileInputSynapse正是這裡的數據導管,通過它數據進入到神經網路。為了更容易實現這點,我們必須要把FileInputSynapse加到神經網路的輸入層。這由下面一行實現。

input.addInputSynapse(inputStream);

現在既然已經建立起神經網路,我們必須創建一個訓練員和一個監視器。訓練員用於訓練該神經網路,因為該監視器通過一個事先設置好的訓練重複數來運行這個神經網路。對於每一次訓練重複,數據被提供到神經網路,然後就可以觀察到結果。該神經網路的權重(存儲在穿梭在神經原層之間的觸角連接中)將根據誤差作適當調整。隨著訓練的進行,誤差級將下降。下列代碼建立訓練員並把它依附到監視器。

trainer = new TeachingSynapse;

trainer.setMonitor(monitor);

你會記得列表1中提供的輸入文件包含三個列。到目前為止,我們僅僅使用了第一、二列,它們指定了到神經網路的輸入。第三列包含當提供給神經網路第一列中的數字時的期盼的輸出值。我們必須使得訓練員能夠存取該列以便能確定誤差。該錯誤是神經網路的實際輸出和期盼的輸出之間的差距。下列代碼創建另外一個FileInputSynapse並作好準備以讀取與前面相同的輸入文件。

// 設置包含期望的響應值的文件,這由FileInputSynapse來提供

samples = new FileInputSynapse;

samples.setFileName(inputFile.getText);

這時,我們想指向在第三列的FileInputSynapse。下列代碼實現了這一點,然後讓訓練員使用這個FileInputSynapse。

//輸出值在文件中的第三列上

samples.setFirstCol(3);

samples.setLastCol(3);

trainer.setDesired(samples);

最後,訓練員被連結到神經網路輸出層,這將使訓練員接收神經網路的輸出。

// 連接訓練員到網路的最後一層

output.addOutputSynapse(trainer);

我們現在已為所有的層準備好後台線程,包括訓練員。

input.start;

hidden.start;

output.start;

trainer.start;

最後,我們為訓練設置一些參數。我們指定在輸入文件中共有四行,而且想訓練20,000個周期,而且還在不段學習。如果你設置學習參數為false,該神經網路將簡單地處理輸入並不進行學習。我們將在下一節討論輸入處理。

monitor.setPatterns(4);

monitor.setTotCicles(20000);

monitor.setLearning(true);

現在我們已經為訓練過程作好準備。調用監視器的Go方法將在後台啟動訓練過程。

monitor.Go;

神經網路現在將要被訓練20,000個周期。當神經網路訓練完成,誤差層應該在一個合理的低級別上。一般低於10%的誤差級是可接受的。



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦