㈠ BP神經網路模型各個參數的選取問題
樣本變數不需要那麼多,因為神經網路的信息存儲能力有限,過多的樣本會造成一些有用的信息被丟棄。如果樣本數量過多,應增加隱層節點數或隱層數目,才能增強學習能力。
一、隱層數
一般認為,增加隱層數可以降低網路誤差(也有文獻認為不一定能有效降低),提高精度,但也使網路復雜化,從而增加了網路的訓練時間和出現「過擬合」的傾向。一般來講應設計神經網路應優先考慮3層網路(即有1個隱層)。一般地,靠增加隱層節點數來獲得較低的誤差,其訓練效果要比增加隱層數更容易實現。對於沒有隱層的神經網路模型,實際上就是一個線性或非線性(取決於輸出層採用線性或非線性轉換函數型式)回歸模型。因此,一般認為,應將不含隱層的網路模型歸入回歸分析中,技術已很成熟,沒有必要在神經網路理論中再討論之。
二、隱層節點數
在BP 網路中,隱層節點數的選擇非常重要,它不僅對建立的神經網路模型的性能影響很大,而且是訓練時出現「過擬合」的直接原因,但是目前理論上還沒有一種科學的和普遍的確定方法。 目前多數文獻中提出的確定隱層節點數的計算公式都是針對訓練樣本任意多的情況,而且多數是針對最不利的情況,一般工程實踐中很難滿足,不宜採用。事實上,各種計算公式得到的隱層節點數有時相差幾倍甚至上百倍。為盡可能避免訓練時出現「過擬合」現象,保證足夠高的網路性能和泛化能力,確定隱層節點數的最基本原則是:在滿足精度要求的前提下取盡可能緊湊的結構,即取盡可能少的隱層節點數。研究表明,隱層節點數不僅與輸入/輸出層的節點數有關,更與需解決的問題的復雜程度和轉換函數的型式以及樣本數據的特性等因素有關。
㈡ 傷寒、副傷寒流行預測模型(BP神經網路)的建立
由於目前研究的各種數學模型或多或少存在使用條件的局限性,或使用方法的復雜性等問題,預測效果均不十分理想,距離實際應用仍有較大差距。NNT是Matlab 中較為重要的一個工具箱,在實際應用中,BP 網路用的最廣泛。神經網路具有綜合能力強,對數據的要求不高,適時學習等突出優點,其操作簡便,節省時間,網路初學者即使不了解其演算法的本質,也可以直接應用功能豐富的函數來實現自己的目的。因此,易於被基層單位預防工作者掌握和應用。以下幾個問題是建立理想的因素與疾病之間的神經網路模型的關鍵:
(1)資料選取
應盡可能地選取所研究地區系統連續的因素與疾病資料,最好包括有疾病高發年和疾病低發年的數據。在收集影響因素時,要抓住主要影響傷寒、副傷寒的發病因素。
(2)疾病發病率分級
神經網路預測法是按發病率高低來進行預測,在定義發病率等級時,要結合專業知識及當地情況而定,並根據網路學習訓練效果而適時調整,以使網路學習訓練達到最佳效果。
(3)資料處理問題
在實踐中發現,資料的特徵往往很大程度地影響網路學習和訓練的穩定性,因此,數據的應用、納入、排出問題有待於進一步研究。
6.3.1 人工神經網路的基本原理
人工神經網路(ANN)是近年來發展起來的十分熱門的交叉學科,它涉及生物、電子、計算機、數學和物理等學科,有著廣泛的應用領域。人工神經網路是一種自適應的高度非線性動力系統,在網路計算的基礎上,經過多次重復組合,能夠完成多維空間的映射任務。神經網路通過內部連接的自組織結構,具有對數據的高度自適應能力,由計算機直接從實例中學習獲取知識,探求解決問題的方法,自動建立起復雜系統的控制規律及其認知模型。
人工神經網路就其結構而言,一般包括輸入層、隱含層和輸出層,不同的神經網路可以有不同的隱含層數,但他們都只有一層輸入和一層輸出。神經網路的各層又由不同數目的神經元組成,各層神經元數目隨解決問題的不同而有不同的神經元個數。
6.3.2 BP神經網路模型
BP網路是在1985年由PDP小組提出的反向傳播演算法的基礎上發展起來的,是一種多層次反饋型網路(圖6.17),它在輸入和輸出之間採用多層映射方式,網路按層排列,只有相鄰層的節點直接相互連接,傳遞之間信息。在正向傳播中,輸入信息從輸入層經隱含層逐層處理,並傳向輸出層,每層神經元的狀態隻影響下一層神經元的狀態。如果輸出層不能得到期望的輸出結果,則轉入反向傳播,將誤差信號沿原來的連同通路返回,通過修改各層神經元的權值,使誤差信號最小。
BP網路的學習演算法步驟如下(圖6.18):
圖6.17 BP神經網路示意圖
圖6.18 BP演算法流程圖
第一步:設置初始參數ω和θ,(ω為初始權重,θ為臨界值,均隨機設為較小的數)。
第二步:將已知的樣本加到網路上,利用下式可算出他們的輸出值yi,其值為
岩溶地區地下水與環境的特殊性研究
式中:xi為該節點的輸入;ωij為從I到j的聯接權;θj為臨界值;yj為實際算出的輸出數據。
第三步:將已知輸出數據與上面算出的輸出數據之差(dj-yj)調整權系數ω,調整量為
ΔWij=ηδjxj
式中:η為比例系數;xj為在隱節點為網路輸入,在輸出點則為下層(隱)節點的輸出(j=1,2…,n);dj為已知的輸出數據(學習樣本訓練數據);δj為一個與輸出偏差相關的值,對於輸出節點來說有
δj=ηj(1-yj)(dj-yj)
對於隱節點來說,由於它的輸出無法進行比較,所以經過反向逐層計算有
岩溶地區地下水與環境的特殊性研究
其中k指要把上層(輸出層)節點取遍。誤差δj是從輸出層反向逐層計算的。各神經元的權值調整後為
ωij(t)=ωij(t-1)+Vωij
式中:t為學習次數。
這個演算法是一個迭代過程,每一輪將各W值調整一遍,這樣一直迭代下去,知道輸出誤差小於某一允許值為止,這樣一個好的網路就訓練成功了,BP演算法從本質上講是把一組樣本的輸入輸出問題變為一個非線性優化問題,它使用了優化技術中最普遍的一種梯度下降演算法,用迭代運算求解權值相當於學習記憶問題。
6.3.3 BP 神經網路模型在傷寒、副傷寒流行與傳播預測中的應用
傷寒、副傷寒的傳播與流行同環境之間有著一定的聯系。根據桂林市1990年以來鄉鎮為單位的傷寒、副傷寒疫情資料,傷寒、副傷寒疫源地資料,結合現有資源與環境背景資料(桂林市行政區劃、土壤、氣候等)和社會經濟資料(經濟、人口、生活習慣等統計資料)建立人工神經網路數學模型,來逼近這種規律。
6.3.3.1 模型建立
(1)神經網路的BP演算法
BP網路是一種前饋型網路,由1個輸入層、若干隱含層和1個輸出層構成。如果輸入層、隱含層和輸出層的單元個數分別為n,q1,q2,m,則該三層網路網路可表示為BP(n,q1,q2,m),利用該網路可實現n維輸入向量Xn=(X1,X2,…,Xn)T到m維輸出向量Ym=(Y1,Y2,…,Ym)T的非線性映射。輸入層和輸出層的單元數n,m根據具體問題確定。
(2)樣本的選取
將模型的輸入變數設計為平均溫度、平均降雨量、岩石性質、岩溶發育、地下水類型、飲用水類型、正規自來水供應比例、集中供水比例8個輸入因子(表6.29),輸出單元為傷寒副傷寒的發病率等級,共一個輸出單元。其中q1,q2的值根據訓練結果進行選擇。
表6.29 桂林市傷寒副傷寒影響因素量化表
通過分析,選取在傷寒副傷寒有代表性的縣鎮在1994~2001年的環境參評因子作為樣本進行訓練。利用聚類分析法對疫情進行聚類分級(Ⅰ、Ⅱ、Ⅲ、Ⅳ),傷寒副傷寒發病最高級為Ⅳ(BP網路中輸出定為4),次之的為Ⅲ(BP網路中輸出定為3),以此類推,最低為Ⅰ(BP網路中輸出定為1)
(3)數據的歸一化處理
為使網路在訓練過程中易於收斂,我們對輸入數據進行了歸一化處理,並將輸入的原始數據都化為0~1之間的數。如將平均降雨量的數據乘以0.0001;將平均氣溫的數據乘以0.01;其他輸入數據也按類似的方法進行歸一化處理。
(4)模型的演算法過程
假設共有P個訓練樣本,輸入的第p個(p=1,2,…,P)訓練樣本信息首先向前傳播到隱含單元上。
經過激活函數f(u)的作用得到隱含層1的輸出信息:
岩溶地區地下水與環境的特殊性研究
經過激活函數f(u)的作用得到隱含層2的輸出信息:
岩溶地區地下水與環境的特殊性研究
激活函數f(u)我們這里採用Sigmoid型,即
f(u)=1/[1+exp(-u)](6.5)
隱含層的輸出信息傳到輸出層,可得到最終輸出結果為
岩溶地區地下水與環境的特殊性研究
以上過程為網路學習的信息正向傳播過程。
另一個過程為誤差反向傳播過程。如果網路輸出與期望輸出間存在誤差,則將誤差反向傳播,利用下式來調節網路權重和閾值:
岩溶地區地下水與環境的特殊性研究
式中:Δω(t)為t次訓練時權重和閾值的修正;η稱為學習速率,0<η<1;E為誤差平方和。
岩溶地區地下水與環境的特殊性研究
反復運用以上兩個過程,直至網路輸出與期望輸出間的誤差滿足一定的要求。
該模型演算法的缺點:
1)需要較長的訓練時間。由於一些復雜的問題,BP演算法可能要進行幾小時甚至更長的時間的訓練,這主要是由於學習速率太小造成的,可採用變化的學習速率或自適應的學習速率加以改進。
2)完全不能訓練。主要表現在網路出現的麻痹現象上,在網路的訓練過程中,當其權值調的過大,可能使得所有的或大部分神經元的加權總和n偏大,這使得激活函數的輸入工作在S型轉移函數的飽和區,從而導致其導數f′(n)非常小,從而使得對網路權值的調節過程幾乎停頓下來。
3)局部極小值。BP演算法可以使網路權值收斂到一個解,但它並不能保證所求為誤差超平面的全局最小解,很可能是一個局部極小解。這是因為BP演算法採用的是梯度下降法,訓練從某一起點沿誤差函數的斜面逐漸達到誤差的最小值。
考慮到以上演算法的缺點,對模型進行了兩方面的改進:
(1)附加動量法
為了避免陷入局部極小值,對模型進行了改進,應用了附加動量法。附加動量法在使網路修正及其權值時,不僅考慮誤差在梯度上的作用,而且考慮在誤差曲面上變化趨勢的影響,其作用如同一個低通濾波器,它允許網路忽略網路上的微小變化特性。在沒有附加動量的作用下,網路可能陷入淺的局部極小值,利用附加動量的作用則有可能滑過這些極小值。
該方法是在反向傳播法的基礎上在每一個權值的變化上加上一項正比於前次權值變化量的值,並根據反向傳播法來產生心的權值變化。促使權值的調節向著誤差曲面底部的平均方向變化,從而防止了如Δω(t)=0的出現,有助於使網路從誤差曲面的局部極小值中跳出。
這種方法主要是把式(6.7)改進為
岩溶地區地下水與環境的特殊性研究
式中:A為訓練次數;a為動量因子,一般取0.95左右。
訓練中對採用動量法的判斷條件為
岩溶地區地下水與環境的特殊性研究
(2)自適應學習速率
對於一個特定的問題,要選擇適當的學習速率不是一件容易的事情。通常是憑經驗或實驗獲取,但即使這樣,對訓練開始初期功效較好的學習速率,不見得對後來的訓練合適。所以,為了盡量縮短網路所需的訓練時間,採用了學習速率隨著訓練變化的方法來找到相對於每一時刻來說較差的學習速率。
下式給出了一種自適應學習速率的調整公式:
岩溶地區地下水與環境的特殊性研究
通過以上兩個方面的改進,訓練了一個比較理想的網路,將動量法和自適應學習速率結合起來,效果要比單獨使用要好得多。
6.3.3.2 模型的求解與預測
採用包含了2個隱含層的神經網路BP(4,q1,q2,1),隱含層單元數q1,q2與所研究的具體問題有關,目前尚無統一的確定方法,通常根據網路訓練情況採用試錯法確定。在滿足一定的精度要求下一般認小的數值,以改善網路的概括推論能力。在訓練中網路的收斂採用輸出值Ykp與實測值tp的誤差平方和進行控制:
岩溶地區地下水與環境的特殊性研究
1)將附加動量法和自適應學習速率結合應用,分析桂林市36個鄉鎮地質條件各因素對傷寒副傷寒發病等級的影響。因此訓練樣本為36個,第一個隱含層有19個神經元,第二個隱含層有11個神經元,學習速率為0.001。
A.程序(略)。
B.網路訓練。在命令窗口執行運行命令,網路開始學習和訓練,其學習和訓練過程如下(圖6.19)。
圖6.19 神經網路訓練過程圖
C.模型預測。
a.輸入未參與訓練的鄉鎮(洞井鄉、兩水鄉、延東鄉、四塘鄉、嚴關鎮、靈田鄉)地質條件數據。
b.預測。程序運行後網路輸出預測值a3,與已知的實際值進行比較,其預測結果整理後見(表6.30)。經計算,對6個鄉鎮傷寒副傷寒發病等級的預測符合率為83.3%。
表6.30 神經網路模型預測結果與實際結果比較
c.地質條件改進方案。在影響疾病發生的地質條件中,大部分地質條件是不會變化的,而改變發病地區的飲用水類型是可以人為地通過改良措施加以實施的一個因素。因此,以靈田鄉為例對發病率較高的鄉鎮進行分析,改變其飲用水類型,來看發病等級的變化情況。
表6.31顯示,在其他地質條件因素不變的情況下,改變當地的地下水類型(從原來的岩溶水類型改變成基岩裂隙水)則將發病等級從原來的最高級4級,下降為較低的2級,效果是十分明顯的。因此,今後在進行傷寒副傷寒疾病防治的時候,可以通過改變高發區飲用水類型來客觀上減少疫情的發生。
表6.31 靈田鄉改變飲用水類型前後的預測結果
2)選取桂林地區1994~2000年月平均降雨量、月平均溫度作為輸入數據矩陣,進行樣本訓練,設定不同的隱含層單元數,對各月份的數據進行BP網路訓練。在隱含層單元數q1=13,q2=9,經過46383次數的訓練,誤差達到精度要求,學習速率0.02。
A.附加動量法程序(略)。
B.網路訓練。在命令窗口執行運行命令,網路開始學習和訓練,其學習和訓練過程如下(圖6.20)。
C.模型預測。
a.輸入桂林市2001年1~12月桂林市各月份的平均氣溫和平均降雨量。預測程度(略)。
b.預測。程序運行後網路輸出預測值a2,與已知的實際值進行比較,其預測結果整理後見(表6.32)。經計算,對2001年1~12月傷寒副傷寒發病等級進行預測,12個預測結果中,有9個符合,符合率為75%。
圖6.20 神經網路訓練過程圖
表6.32 神經網路模型預測結果與實際值比較
6.3.3.3 模型的評價
本研究採用BP神經網路對傷寒、副傷寒發病率等級進行定量預測,一方面引用數量化理論對不確定因素進行量化處理;另一方面利用神經網路優點,充分考慮各影響因素與發病率之間的非線性映射。
實際應用表明,神經網路定量預測傷寒、副傷寒發病率是理想的。
其主要優點有:
1)避免了模糊或不確定因素的分析工作和具體數學模型的建立工作。
2)完成了輸入和輸出之間復雜的非線性映射關系。
3)採用自適應的信息處理方式,有效減少人為的主觀臆斷性。
雖然如此,但仍存在以下缺點:
1)學習演算法的收斂速度慢,通常需要上千次或更多,訓練時間長。
2)從數學上看,BP演算法有可能存在局部極小問題。
本模型具有廣泛的應用范圍,可以應用在很多領域。從上面的結果可以看出,實際和網路學習數據總體較為接近,演化趨勢也基本一致。說明選定的氣象因子、地質條件因素為神經單元獲得的傷寒、副傷寒發病等級與實際等級比較接近,從而證明傷寒、副傷寒流行與地理因素的確存在較密切的相關性。
㈢ bp神經網路
BP(Back Propagation)網路是1986年由Rumelhart和McCelland為首的科學家小組提出,是一種按誤差逆傳播演算法訓練的多層前饋網路,是目前應用最廣泛的神經網路模型之一。BP網路能學習和存貯大量的輸入-輸出模式映射關系,而無需事前揭示描述這種映射關系的數學方程。它的學習規則是使用最速下降法,通過反向傳播來不斷調整網路的權值和閾值,使網路的誤差平方和最小。BP神經網路模型拓撲結構包括輸入層(input)、隱層(hide layer)和輸出層(output layer)。
人工神經網路就是模擬人思維的第二種方式。這是一個非線性動力學系統,其特色在於信息的分布式存儲和並行協同處理。雖然單個神經元的結構極其簡單,功能有限,但大量神經元構成的網路系統所能實現的行為卻是極其豐富多彩的。
人工神經網路首先要以一定的學習准則進行學習,然後才能工作。現以人工神經網路對手寫「A」、「B」兩個字母的識別為例進行說明,規定當「A」輸入網路時,應該輸出「1」,而當輸入為「B」時,輸出為「0」。
所以網路學習的准則應該是:如果網路作出錯誤的的判決,則通過網路的學習,應使得網路減少下次犯同樣錯誤的可能性。首先,給網路的各連接權值賦予(0,1)區間內的隨機值,將「A」所對應的圖象模式輸入給網路,網路將輸入模式加權求和、與門限比較、再進行非線性運算,得到網路的輸出。在此情況下,網路輸出為「1」和「0」的概率各為50%,也就是說是完全隨機的。這時如果輸出為「1」(結果正確),則使連接權值增大,以便使網路再次遇到「A」模式輸入時,仍然能作出正確的判斷。
如果輸出為「0」(即結果錯誤),則把網路連接權值朝著減小綜合輸入加權值的方向調整,其目的在於使網路下次再遇到「A」模式輸入時,減小犯同樣錯誤的可能性。如此操作調整,當給網路輪番輸入若干個手寫字母「A」、「B」後,經過網路按以上學習方法進行若干次學習後,網路判斷的正確率將大大提高。這說明網路對這兩個模式的學習已經獲得了成功,它已將這兩個模式分布地記憶在網路的各個連接權值上。當網路再次遇到其中任何一個模式時,能夠作出迅速、准確的判斷和識別。一般說來,網路中所含的神經元個數越多,則它能記憶、識別的模式也就越多。
如圖所示拓撲結構的單隱層前饋網路,一般稱為三層前饋網或三層感知器,即:輸入層、中間層(也稱隱層)和輸出層。它的特點是:各層神經元僅與相鄰層神經元之間相互全連接,同層內神經元之間無連接,各層神經元之間無反饋連接,構成具有層次結構的前饋型神經網路系統。單計算層前饋神經網路只能求解線性可分問題,能夠求解非線性問題的網路必須是具有隱層的多層神經網路。
神經網路的研究內容相當廣泛,反映了多學科交叉技術領域的特點。主要的研究工作集中在以下幾個方面:
(1)生物原型研究。從生理學、心理學、解剖學、腦科學、病理學等生物科學方面研究神經細胞、神經網路、神經系統的生物原型結構及其功能機理。
(2)建立理論模型。根據生物原型的研究,建立神經元、神經網路的理論模型。其中包括概念模型、知識模型、物理化學模型、數學模型等。
(3)網路模型與演算法研究。在理論模型研究的基礎上構作具體的神經網路模型,以實現計算機模擬或准備製作硬體,包括網路學習演算法的研究。這方面的工作也稱為技術模型研究。
(4)人工神經網路應用系統。在網路模型與演算法研究的基礎上,利用人工神經網路組成實際的應用系統,例如,完成某種信號處理或模式識別的功能、構作專家系統、製成機器人等等。
縱觀當代新興科學技術的發展歷史,人類在征服宇宙空間、基本粒子,生命起源等科學技術領域的進程中歷經了崎嶇不平的道路。我們也會看到,探索人腦功能和神經網路的研究將伴隨著重重困難的克服而日新月異。
神經網路可以用作分類、聚類、預測等。神經網路需要有一定量的歷史數據,通過歷史數據的訓練,網路可以學習到數據中隱含的知識。在你的問題中,首先要找到某些問題的一些特徵,以及對應的評價數據,用這些數據來訓練神經網路。
雖然BP網路得到了廣泛的應用,但自身也存在一些缺陷和不足,主要包括以下幾個方面的問題。
首先,由於學習速率是固定的,因此網路的收斂速度慢,需要較長的訓練時間。對於一些復雜問題,BP演算法需要的訓練時間可能非常長,這主要是由於學習速率太小造成的,可採用變化的學習速率或自適應的學習速率加以改進。
其次,BP演算法可以使權值收斂到某個值,但並不保證其為誤差平面的全局最小值,這是因為採用梯度下降法可能產生一個局部最小值。對於這個問題,可以採用附加動量法來解決。
再次,網路隱含層的層數和單元數的選擇尚無理論上的指導,一般是根據經驗或者通過反復實驗確定。因此,網路往往存在很大的冗餘性,在一定程度上也增加了網路學習的負擔。
最後,網路的學習和記憶具有不穩定性。也就是說,如果增加了學習樣本,訓練好的網路就需要從頭開始訓練,對於以前的權值和閾值是沒有記憶的。但是可以將預測、分類或聚類做的比較好的權值保存。
㈣ bp神經網路,是不是數據越多,預測能力越好!
准確的說是數據越全面,越能體現數據分布,預測才越好
但一般我們也不知道數據原本的分布是怎麼樣的~所以,收集越多的不同的數據,一般來說預測就越好。當然,如果發現數據多到一個程度後,預測效果沒什麼變化,說明數據的表達能力,或者說數據的分布已經很充沛了,特徵方差不變了,多了也沒什麼用
㈤ BP神經網路的訓練集需要大樣本嗎一般樣本個數為多少
BP神經網路的訓練集需要大樣本嗎?一般樣本個數為多少?
BP神經網路樣本數有什麼影響
學習神經網路這段時間,有一個疑問,BP神經網路中訓練的次數指的網路的迭代次數,如果有a個樣本,每個樣本訓練次數n,則網路一共迭代an次,在n>>a 情況下 , 網路在不停的調整權值,減小誤差,跟樣本數似乎關系不大。而且,a大了的話訓練時間必然會變長。
換一種說法,將你的數據集看成一個固定值, 那麼樣本集與測試集 也可以按照某種規格確定下來如7:3 所以如何看待 樣本集的多少與訓練結果呢? 或者說怎麼使你的網路更加穩定,更加符合你的所需 。
我嘗試從之前的一個例子中看下區別
如何用70行Java代碼實現深度神經網路演算法
作者其實是實現了一個BP神經網路 ,不多說,看最後的例子
一個運用神經網路的例子
最後我們找個簡單例子來看看神經網路神奇的效果。為了方便觀察數據分布,我們選用一個二維坐標的數據,下面共有4個數據,方塊代表數據的類型為1,三角代表數據的類型為0,可以看到屬於方塊類型的數據有(1,2)和(2,1),屬於三角類型的數據有(1,1),(2,2),現在問題是需要在平面上將4個數據分成1和0兩類,並以此來預測新的數據的類型。
圖片描述
我們可以運用邏輯回歸演算法來解決上面的分類問題,但是邏輯回歸得到一個線性的直線做為分界線,可以看到上面的紅線無論怎麼擺放,總是有一個樣本被錯誤地劃分到不同類型中,所以對於上面的數據,僅僅一條直線不能很正確地劃分他們的分類,如果我們運用神經網路演算法,可以得到下圖的分類效果,相當於多條直線求並集來劃分空間,這樣准確性更高。
圖片描述
簡單粗暴,用作者的代碼運行後 訓練5000次 。根據訓練結果來預測一條新數據的分類(3,1)
預測值 (3,1)的結果跟(1,2)(2,1)屬於一類 屬於正方形
這時如果我們去掉 2個樣本,則樣本輸入變成如下
//設置樣本數據,對應上面的4個二維坐標數據
double[][] data = new double[][]{{1,2},{2,2}};
//設置目標數據,對應4個坐標數據的分類
double[][] target = new double[][]{{1,0},{0,1}};
1
2
3
4
1
2
3
4
則(3,1)結果變成了三角形,
如果你選前兩個點 你會發現直接一條中間線就可以區分 這時候的你的結果跟之前4個點時有區別 so 你得增加樣本 直到這些樣本按照你所想要的方式分類 ,所以樣本的多少 重要性體現在,樣本得能反映所有的特徵值(也就是輸入值) ,樣本多少或者特徵(本例子指點的位置特徵)決定的你的網路的訓練結果,!!!這是 我們反推出來的結果 。這里距離深度學習好像近了一步。
另外,這個70行代碼的神經網路沒有保存你訓練的網路 ,所以你每次運行都是重新訓練的網路。其實,在你訓練過後 權值已經確定了下來,我們確定網路也就是根據權值,so只要把訓練後的權值保存下來,將需要分類的數據按照這種權值帶入網路,即可得到輸出值,也就是一旦網路確定, 權值也就確定,一個輸入對應一個固定的輸出,不會再次改變!個人見解。
最後附上作者的源碼,作者的文章見開頭鏈接
下面的實現程序BpDeep.java可以直接拿去使用,
import java.util.Random;
public class BpDeep{
public double[][] layer;//神經網路各層節點
public double[][] layerErr;//神經網路各節點誤差
public double[][][] layer_weight;//各層節點權重
public double[][][] layer_weight_delta;//各層節點權重動量
public double mobp;//動量系數
public double rate;//學習系數
public BpDeep(int[] layernum, double rate, double mobp){
this.mobp = mobp;
this.rate = rate;
layer = new double[layernum.length][];
layerErr = new double[layernum.length][];
layer_weight = new double[layernum.length][][];
layer_weight_delta = new double[layernum.length][][];
Random random = new Random();
for(int l=0;l<layernum.length;l++){
layer[l]=new double[layernum[l]];
layerErr[l]=new double[layernum[l]];
if(l+1<layernum.length){
layer_weight[l]=new double[layernum[l]+1][layernum[l+1]];
layer_weight_delta[l]=new double[layernum[l]+1][layernum[l+1]];
for(int j=0;j<layernum[l]+1;j++)
for(int i=0;i<layernum[l+1];i++)
layer_weight[l][j][i]=random.nextDouble();//隨機初始化權重
}
}
}
//逐層向前計算輸出
public double[] computeOut(double[] in){
for(int l=1;l<layer.length;l++){
for(int j=0;j<layer[l].length;j++){
double z=layer_weight[l-1][layer[l-1].length][j];
for(int i=0;i<layer[l-1].length;i++){
layer[l-1][i]=l==1?in[i]:layer[l-1][i];
z+=layer_weight[l-1][i][j]*layer[l-1][i];
}
layer[l][j]=1/(1+Math.exp(-z));
}
}
return layer[layer.length-1];
}
//逐層反向計算誤差並修改權重
public void updateWeight(double[] tar){
int l=layer.length-1;
for(int j=0;j<layerErr[l].length;j++)
layerErr[l][j]=layer[l][j]*(1-layer[l][j])*(tar[j]-layer[l][j]);
while(l-->0){
for(int j=0;j<layerErr[l].length;j++){
double z = 0.0;
for(int i=0;i<layerErr[l+1].length;i++){
z=z+l>0?layerErr[l+1][i]*layer_weight[l][j][i]:0;
layer_weight_delta[l][j][i]= mobp*layer_weight_delta[l][j][i]+rate*layerErr[l+1][i]*layer[l][j];//隱含層動量調整
layer_weight[l][j][i]+=layer_weight_delta[l][j][i];//隱含層權重調整
if(j==layerErr[l].length-1){
layer_weight_delta[l][j+1][i]= mobp*layer_weight_delta[l][j+1][i]+rate*layerErr[l+1][i];//截距動量調整
layer_weight[l][j+1][i]+=layer_weight_delta[l][j+1][i];//截距權重調整
}
}
layerErr[l][j]=z*layer[l][j]*(1-layer[l][j]);//記錄誤差
}
}
}
public void train(double[] in, double[] tar){
double[] out = computeOut(in);
updateWeight(tar);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
下面是這個測試程序BpDeepTest.java的源碼:
import java.util.Arrays;
public class BpDeepTest{
public static void main(String[] args){
//初始化神經網路的基本配置
//第一個參數是一個整型數組,表示神經網路的層數和每層節點數,比如{3,10,10,10,10,2}表示輸入層是3個節點,輸出層是2個節點,中間有4層隱含層,每層10個節點
//第二個參數是學習步長,第三個參數是動量系數
BpDeep bp = new BpDeep(new int[]{2,10,2}, 0.15, 0.8);
//設置樣本數據,對應上面的4個二維坐標數據
double[][] data = new double[][]{{1,2},{2,2},{1,1},{2,1}};
//設置目標數據,對應4個坐標數據的分類
double[][] target = new double[][]{{1,0},{0,1},{0,1},{1,0}};
//迭代訓練5000次
for(int n=0;n<5000;n++)
for(int i=0;i<data.length;i++)
bp.train(data[i], target[i]);
//根據訓練結果來檢驗樣本數據
for(int j=0;j<data.length;j++){
double[] result = bp.computeOut(data[j]);
System.out.println(Arrays.toString(data[j])+":"+Arrays.toString(result));
}
//根據訓練結果來預測一條新數據的分類
double[] x = new double[]{3,1};
double[] result = bp.computeOut(x);
System.out.println(Arrays.toString(x)+":"+Arrays.toString(result));
}
}
㈥ bp神經網路在多輸入多輸出的情況下,預測的精度為什麼這么差
bp神經網路是有一定缺陷的,比如容易陷入局部極小值,還有訓練的結果依賴初始隨機權值,這就好比你下一個山坡,如果最開始的方向走錯了,那麼你可能永遠也到不了正確的山腳。可以說bp神經網路很難得到正確答案,也沒有唯一解,有些時候只能是更多次地嘗試、修改參數,這個更多依賴自己的經驗,通俗點說就是「你覺得行了,那就是行了」,而不像1+1=2那樣確切。
如果有耐心,確定方法沒問題,那麼接下來需要做的就是不停地嘗試、訓練,得到你想要的結果。
另外,我不知道你預測的是什麼,是時間序列么?比如證券?這種預測,比較重要的就是輸入參數是否合適,這個直接決定了結果精度
㈦ 在BP神經網路中,對輸入的數據也就是訓練集有要求嗎是不是要求訓練集是固定的,然後每個訓練周期都將訓
訓練集樣本的不同肯定會影響到權值的變化。你要訓練的數據 就是你希望一個系統輸入一些數據時 能固定得到的那些數據,訓練集要是隨即那就沒意義了,神經網路權值初始值是可以隨即的,但隨著訓練繼續,權值將趨於穩定,這樣才能達到神經網路的效果。