1. 程式人生 > >用Java開源專案JOONE實現人工智慧程式設計

用Java開源專案JOONE實現人工智慧程式設計

簡介
很少有程式設計師不對這裡或者那裡所包含的人工智慧程式設計所吸引,然而,許多對AI感興趣的程式設計師很快就因其中包含的演算法的複雜性而退卻。在本文中,我們將討論一個能大大簡化這種複雜性的Java開源工程。
Java面向物件的神經網路(JOONE)是一開源工程,它提供給Java程式設計師一個高適應性的神經網路。該JOONE工程原始碼由LGPL所保護。簡言之,這意味著原始碼是可自由使用的而且你不需要支付版稅就可以使用JOONE。JOONE可以從http://joone.sourceforge.net/處下載。
JOONE能允許你輕易地從一個Java程式中建立神經網路。JOONE支援許多特徵,如多執行緒和分散式處理。這意味著JOONE能利用多處理機計算機和多臺計算機的優勢來進行分散式處理。
神經網路


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


圖1:一個生物學的神經原

從圖1中你可以看出,神經原由一個核心細胞和幾個長長的稱為觸角的聯結器組成。神經原之間依靠這些觸角進行連線。無論是生物學的還是人工的神經網路,都通過觸角把訊號從一個神經原傳遞到另一個神經原來工作。
使用JOONE
在這篇文章中,你將看到一個簡單的怎樣使用JOONE的例項。神經網路題目涉及廣泛並覆蓋許多不同的應用領域。在本文中,我們將展示給你怎樣使用JOONE來解決一個很簡單的模式識別問題。模式識別是神經網路中的最普遍的應用之一。
模式識別提供給神經網路一種模式,判斷是否該神經網路能夠識別出該模式。這種模式應該能夠在某種程度上被扭曲而該神經網路仍然能夠識別它。這很像人類識別東西(如一個交通標誌)的能力。人類應該能夠識別在下雨天,晴天或者晚上的交通標誌。即使這些影象看上去可能相當不同,但人類的大腦仍能夠判斷出它們是一樣的影象。
當進行JOONE程式設計時,你一般要使用兩種型別的物件。你要使用神經原層物件,用於描述一層的一個或多個的具有相似特徵的神經原。神經網路經常有一層或兩層神經元。這些神經元層通過觸角聯絡在一起。這些觸角把這種待識別的模式,從一個神經元層傳輸到另一個神經元層。
觸角不僅把這種模式從一個神經元層傳輸到另一個神經元層。觸角還將生成一些指向這種模式的元素的斜線。這些斜線將導致這種模式的某些元素在被傳輸到下一個神經元層時不如通過其它方式傳遞更有效些。這些斜線通常稱為權重,它們形成神經網路的儲存系統。通過調整儲存在觸角中的這些權重,可以更改神經網路的行為。 
觸角在JOONE中還承擔著另外一個角色。在JOONE中,可以把觸角看作是資料導管。正如觸角把模式從一個神經元層傳輸到另一個神經元層,指定版本的觸角用於把模式傳入和傳出神經網路。下面將給你展示一個簡單的單層的神經網路是怎樣被構建並進行模式識別的。

訓練神經網路
為實現本文的目的,我們將指導JOONE去識別一個很簡單的模式。在這種模式中,我們將考察一個二進位制的布林操作,例如XOR。這個XOR操作的真值表列舉如下:

X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0

正如你從上表中看到的,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%的誤差級是可接受的。

執行神經網路
現在,既然神經網路已經訓練開始,我們可以通過提供輸入模式給神經網路來測試它並觀察結果。用於執行神經網路的方法必須首先為神經網路處理資料作好準備。目前,該神經網路處理一種訓練方式中。首先,我們將從輸出層刪除訓練員。然後,我們將用FileOutputSynapse替換訓練員,以便於我們能記錄來自於神經網路的輸出。下面的程式碼實現這一點:

output.removeOutputSynapse(trainer);
FileOutputSynapse results = new FileOutputSynapse();
results.setFileName(resultFile.getText());

現在我們必須重置輸入流--我們將使用與訓練期間一樣的檔案輸入流。這將填入在神經網路訓練期間使用的相同的輸入。
inputStream.resetInput();
samples.resetInput();
results.setMonitor(monitor);
output.addOutputSynapse(results);

然後,我們必須重啟響應於該神經網路所有的執行緒。
input.start();
hidden.start();
output.start();
trainer.start();

現在,既然執行緒已被重新啟動,我們必須為下一步的識別設定一些基本配置資訊。下面程式碼完成這些工作。
monitor.setPatterns(4);
monitor.setTotCicles(1);
monitor.setLearning(false);

首先,輸入模式數要置為4,這是因為我們想要神經網路處理所有這四種輸入模式(你以前為訓練該神經網路提供的)。最後,置為學習方式。這些完成後,我們可以呼叫監視器的"Go"方法。
monitor.Go();


當訓練完成,你將看到輸出檔案產生的結果類似列表2。
列表2:來自於神經網路的輸出
0.012549763955262739
0.9854631848890223
0.9853159647305264
0.01783622084836082
可以看出,上面列表中的第一行中的數字合理地接近於零。這是很好的,因為輸入訓練檔案的第一行,如列表1所示,被預期結果是為零的。同樣,第二行合理地接近於1,這也很好,因為訓練檔案的第二行被預期結果也是為1的。
結論
JOONE引擎封裝了神經網路程式設計中的具有相當多的複雜性,本文的例子顯示了神經網路使用的基本過程。儘管真實世界中神經網路的實現將複雜得多,但是其基本處理過程是一樣的--資料被提供到神經網路用於訓練,然後生成新的模式用於識別。這裡的例程為用JOONE進行探索提供了一個良好的開端。


相關推薦

Java開源專案JOONE實現人工智慧程式設計

簡介很少有程式設計師不對這裡或者那裡所包含的人工智慧程式設計所吸引,然而,許多對AI感興趣的程式設計師很快就因其中包含的演算法的複雜性而退卻。在本文中,我們將討論一個能大大簡化這種複雜性的Java開源工程。 Java面向物件的神經網路(JOONE)是一開源工程,它提供給J

Java+xml配置方式實現Spring資料事務(程式設計式事務)

一、用Java配置的方式 1、實體類: Role  public class Role { private int id; private String roleName; private String note; @Override

sqlite3對資料庫加密c語言開源專案wxSQLite3實現

今天對逍遙來說是個特別的日子,有兩件喜事:1、正式本科畢業啊,即將開始新的人生冒險。2、完成了對sqlite3用C語言實現的加密與讀取。對資料庫加密的必要性,在此就不必多說啦。僅對我在實現加密的過程中,遇到的問題及解決方法進行記錄,便於自己複習,也方便他人。在此感謝CSDN

Java編程如何實現合並圖片

vax pac pack ear imageio 實現 rgs awt art   對於很多用Java實現圖片合並的方法有很多,下面本人就分享一個用Java實現圖片合並的代碼給大家,具體如下:   1. package com.test;   2. import java.

Java Map相關知識實現簡易購物車功能

實現購物車功能 問題:實現一個購物車功能 分析:要實現這個功能,可以建立三個類,分別是Product商品類,ShopCart購物車類,Exercise測試類。Product類,裡面描述商品的一些基本屬性,編號,名稱,單價。 下面演示如何用程式碼實現需求。先定義一個商品類。 package

18個實時音視訊開發中會開源專案(轉)

本文轉載自部落格:https://blog.csdn.net/dittychen/article/details/79345828 ----------------------------------------------------------------------------------

中老年人計算機基礎與應用培訓通知18個實時音視訊開發中會開源專案

  實時音視訊的開發學習有很多可以參考的開源專案。一個實時音視訊應用共包括幾個環節:採集、編碼、前後處理、傳輸、解碼、緩衝、渲染等很多環節。每一個細分環節,還有更細分的技術模組。比如,前後處理環節有美顏、濾鏡、回聲消除、噪聲抑制等,採集有麥克風陣列等,編解碼有VP8、VP9、H.264、H.

Java開源專案-圖片相似度測試系統-執行綜述

本文主要介紹如何搭建環境,併成功的執行一個圖片相似度測試專案。該專案基於Spring框架,建立了圖片上傳Restful API,並使用OpenCV進行影象的處理,提取出圖中的物品同時對物品進行相似度對比操作。專案中,結合了兩種圖片相似度測試的方法,對處理過的圖片

java多執行緒實現一個簡單的水池進出水問題

需求: 有一個水池100L,有出水口和入水口,出水口和入水口不能同時開啟,入水口每次注入5L水,出水口每次出4L水,如果池子注滿水,或者池子中沒有水就停止。 使用繼承Thread類的方式編寫出水口,使用實現Runnable方式編寫入水口,執行結果。 package po

關於怎麼在java在redis上實現秒殺

為什麼用redis來實現秒殺功能 ,這麼不加贅述。 一、需要準備的外掛和包 Spring data  redis  jedis redisson jdk1.8等 二、思路 想要使用redis來實現秒殺,首先需要連結上redis,對redis進行操作,這裡需要使用

java原生介面Serializable實現對單例物件的序列化

單例類,也是將要序列化的類 package test; import java.io.Serializable; import java.util.Date; /** * 定義一個可序列化的單例類,單例實現方法是靜態內部類實現 同時為了在序列化後,再

windows 打包Java web專案內容實現一鍵安裝

 1.下載MySQL、JDK、Tomcat 【MySQL64位】 【MySQL32位】 【JDK 64位】 【JDK 32位】 【Tomcat64位】 【Tomcat32位】 解壓MySQL、Tomcat,安裝JDK 建

【網站】國內最火的10款Java開源專案,都是國人開發,CMS居多

國內的開源環境已經相當好,但是國內開發注重是應用,創新有但不多,從榜單可以看出,專門搞技術的還是少數,結合專案實踐的站大多數,分享給你們,架構的時候可以參考這些解決方案,傳送門:gogeeks.cn zheng徵專案(stars 5.6k) 基於Spring+Spring

值得關注和學習的java開源專案

名稱 資料 概況 OFBiz http://ofbizchina.com:8080/ http://www.ofbiz.org/ https://ofbiz.dev.java.net/ OFBiz是一個非常著名的開源專案,提供了建立基於最新J2EE/X

即插即開源專案[雲框架]釋出“基於Spring cloud的微服務架構”

[雲框架]基於Spring Cloud的微服務架構 開發者面對新技術無非兩個場景,一是不懂技術想要學習,二是懂技術想要使用。 前者需要考慮如何快速掌握技術原理並能把技術用起來,而後者需要琢磨如何花費最小代價將技術應用於生產環境。 換句話說,想要獲得新技

java多執行緒實現“百度翻譯介面API快速翻譯”

不知道為啥,突然開始想寫部落格,可能是想找個地方寫點東西,煽情文藝的咱寫不了,就寫技術貼好了。不當之處,還希望同志們多多指教,不勝感激。 API準備:自己先到百度去申請一個百度翻譯API,話說百度翻譯還是可以的,每個月200W字元的免費翻譯,不做商業的基本夠用了,感謝百

Java WEB專案如何實現驗證碼

驗證基礎 一.什麼是驗證碼及驗證碼的作用 驗證碼為全自動區分計算機和人類的圖靈測試的縮寫。是一種區分使用者還是計算機的全自動程式,這個問題可以由計算機生成並進行判斷,但是隻有人類才可以解答。可以防止惡意破解密碼,刷票,論壇灌水,有效防止某個黑客對某一

Java開源專案管理工具大全

XPlanner 一個基於Web的XP團隊計劃和跟蹤工具。XP獨特的開發概念如iteration、user stories等,XPlanner都提供了相對應的的管理工具,XPlanner支援XP開發流程,並解決利用XP思想來開發專案所碰到的問題。 XPlanner特點包括:簡單的模型規劃,虛擬筆記卡(Vi

java開源專案CrapApi介面管理系統

CrapApi 應用介面管理,一個由anjularjs+bootstrap+springMVC搭建的免費開源的API介面管理系統(應用介面管理系統) 後臺開發語言為java,主要技術:anjularjs、bootstrap、springMVC、hibernate、m

JAVA Maven專案如何實現定時任務!

<properties> <java.version>7</java.version> <project.build.sourc