理論情況下,三層的神經網路能完成任意的n維到m維的映射。
輸入層神經單元數確定方法:根據需要求解的問題和數據表示方式確定。
隱層的神經單元數確定方法:最佳的隱層單元數一定存在,但需要根據經驗和多次試驗確定。
經驗公式如n2=2*n1+1等。
輸出層神經單元數確定方法:有使用者要求來定,如bp網路用為分類器,一般有兩種方式:
1,m; 2,log2(m).
層次太多增加了復雜度,並不一定能更好的識別。
神經網路模型的分類
人工神經網路的模型很多,可以按照不同的方法進行分類。其中,常見的兩種分類方法是,按照網路連接的拓樸結構分類和按照網路內部的信息流向分類。
1 按照網路拓樸結構分類
網路的拓樸結構,即神經元之間的連接方式。按此劃分,可將神經網路結構分為兩大類:層次型結構和互聯型結構。
層次型結構的神經網路將神經元按功能和順序的不同分為輸出層、中間層(隱層)、輸出層。輸出層各神經元負責接收來自外界的輸入信息,並傳給中間各隱層神經元;隱層是神經網路的內部信息處理層,負責信息變換。根據需要可設計為一層或多層;最後一個隱層將信息傳遞給輸出層神經元經進一步處理後向外界輸出信息處理結果。
而互連型網路結構中,任意兩個節點之間都可能存在連接路徑,因此可以根據網路中節點的連接程度將互連型網路細分為三種情況:全互連型、局部互連型和稀疏連接型
2 按照網路信息流向分類
從神經網路內部信息傳遞方向來看,可以分為兩種類型:前饋型網路和反饋型網路。
單純前饋網路的結構與分層網路結構相同,前饋是因網路信息處理的方向是從輸入層到各隱層再到輸出層逐層進行而得名的。前饋型網路中前一層的輸出是下一層的輸入,信息的處理具有逐層傳遞進行的方向性,一般不存在反饋環路。因此這類網路很容易串聯起來建立多層前饋網路。
反饋型網路的結構與單層全互連結構網路相同。在反饋型網路中的所有節點都具有信息處理功能,而且每個節點既可以從外界接受輸入,同時又可以向外界輸出。
③ 神經網路的分類:
選擇模式:這將取決於數據的表示和應用。過於復雜的模型往往會導致問題的學習。
學習演算法:在學習演算法之間有無數的權衡。幾乎所有的演算法為了一個特定的數據集訓練將會很好地與正確的超參數合作。然而,選擇和調整的演算法上看不見的數據訓練需要顯著量的實驗。
穩健性:如果該模型中,成本函數和學習演算法,適當地選擇所得到的神經網路可以是非常健壯的。有了正確的實施,人工神經網路,可以自然地應用於在線學習和大型數據集的應用程序。其簡單的實現和表現在結構上主要依賴本地的存在,使得在硬體快速,並行實現。
④ 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));
}
}
⑤ 神經網路演算法的三大類分別是
神經網路演算法的三大類分別是:
1、前饋神經網路:
這是實際應用中最常見的神經網路類型。第一層是輸入,最後一層是輸出。如果有多個隱藏層,我們稱之為「深度」神經網路。他們計算出一系列改變樣本相似性的變換。各層神經元的活動是前一層活動的非線性函數。
2、循環網路:
循環網路在他們的連接圖中定向了循環,這意味著你可以按照箭頭回到你開始的地方。他們可以有復雜的動態,使其很難訓練。他們更具有生物真實性。
循環網路的目的是用來處理序列數據。在傳統的神經網路模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連接的,每層之間的節點是無連接的。但是這種普通的神經網路對於很多問題卻無能無力。
循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。
3、對稱連接網路:
對稱連接網路有點像循環網路,但是單元之間的連接是對稱的(它們在兩個方向上權重相同)。比起循環網路,對稱連接網路更容易分析。
這個網路中有更多的限制,因為它們遵守能量函數定律。沒有隱藏單元的對稱連接網路被稱為「Hopfield 網路」。有隱藏單元的對稱連接的網路被稱為玻爾茲曼機。
(5)神經網路分類要達到多少擴展閱讀:
應用及發展:
心理學家和認知科學家研究神經網路的目的在於探索人腦加工、儲存和搜索信息的機制,弄清人腦功能的機理,建立人類認知過程的微結構理論。
生物學、醫學、腦科學專家試圖通過神經網路的研究推動腦科學向定量、精確和理論化體系發展,同時也寄希望於臨床醫學的新突破;信息處理和計算機科學家研究這一問題的目的在於尋求新的途徑以解決不能解決或解決起來有極大困難的大量問題,構造更加逼近人腦功能的新一代計算機。
⑥ 人工神經網路分類方法
從20世紀80年代末期,人工神經網路方法開始應用於遙感圖像的自動分類。目前,在遙感圖像的自動分類方面,應用和研究比較多的人工神經網路方法主要有以下幾種:
(1)BP(Back Propagation)神經網路,這是一種應用較廣泛的前饋式網路,屬於有監督分類演算法,它將先驗知識融於網路學習之中,加以最大限度地利用,適應性好,在類別數少的情況下能夠得到相當高的精度,但是其網路的學習主要採用誤差修正演算法,識別對象種類多時,隨著網路規模的擴大,需要的計算過程較長,收斂緩慢而不穩定,且識別精度難以達到要求。
(2)Hopfield神經網路。屬於反饋式網路。主要採用Hebb規則進行學習,一般情況下計算的收斂速度較快。這種網路是美國物理學家J.J.Hopfield於1982年首先提出的,它主要用於模擬生物神經網路的記憶機理。Hopfield神經網路狀態的演變過程是一個非線性動力學系統,可以用一組非線性差分方程來描述。系統的穩定性可用所謂的「能量函數」進行分析,在滿足一定條件下,某種「能量函數」的能量在網路運行過程中不斷地減少,最後趨於穩定的平衡狀態。Hopfield網路的演變過程是一種計算聯想記憶或求解優化問題的過程。
(3)Kohonen網路。這是一種由芬蘭赫爾辛基大學神經網路專家Kohonen(1981)提出的自組織神經網路,其採用了無導師信息的學習演算法,這種學習演算法僅根據輸入數據的屬性而調整權值,進而完成向環境學習、自動分類和聚類等任務。其最大的優點是最終的各個相鄰聚類之間是有相似關系的,即使識別時把樣本映射到了一個錯誤的節點,它也傾向於被識別成同一個因素或者一個相近的因素,這就十分接近人的識別特性。
⑦ 人工神經網路的分類
人工神經網路模型主要考慮網路連接的拓撲結構、神經元的特徵、學習規則等。目前,已有近40種神經網路模型,其中有反傳網路、感知器、自組織映射、Hopfield網路、波耳茲曼機、適應諧振理論等。
ann:人工神經網路(Artificial Neural Networks)
bp:Back Propagation網路是1986年由Rumelhart和McCelland為首的科學家小組提出,是一種按誤差逆傳播演算法訓練的多層前饋網路,是目前應用最廣泛的神經網路模型之一。BP網路能學習和存貯大量的輸入-輸出模式映射關系,而無需事前揭示描述這種映射關系的數學方程。它的學習規則是使用最速下降法,通過反向傳播來不斷調整網路的權值和閾值,使網路的誤差平方和最小。BP神經網路模型拓撲結構包括輸入層(input)、隱層(hide layer)和輸出層(output layer)。
⑧ 神經網路模型有幾種分類方法,試給出一種分類
神經網路模型的分類人工神經網路的模型很多,可以按照不同的方法進行分類。其中,常見的兩種分類方法是,按照網路連接的拓樸結構分類和按照網路內部的信息流向分類。1 按照網路拓樸結構分類網路的拓樸結構,即神經元之間的連接方式。按此劃分,可將神經網路結構分為兩大類:層次型結構和互聯型結構。層次型結構的神經網路將神經元按功能和順序的不同分為輸出層、中間層(隱層)、輸出層。輸出層各神經元負責接收來自外界的輸入信息,並傳給中間各隱層神經元;隱層是神經網路的內部信息處理層,負責信息變換。根據需要可設計為一層或多層;最後一個隱層將信息傳遞給輸出層神經元經進一步處理後向外界輸出信息處理結果。 而互連型網路結構中,任意兩個節點之間都可能存在連接路徑,因此可以根據網路中節點的連接程度將互連型網路細分為三種情況:全互連型、局部互連型和稀疏連接型2 按照網路信息流向分類從神經網路內部信息傳遞方向來看,可以分為兩種類型:前饋型網路和反饋型網路。單純前饋網路的結構與分層網路結構相同,前饋是因網路信息處理的方向是從輸入層到各隱層再到輸出層逐層進行而得名的。前饋型網路中前一層的輸出是下一層的輸入,信息的處理具有逐層傳遞進行的方向性,一般不存在反饋環路。因此這類網路很容易串聯起來建立多層前饋網路。反饋型網路的結構與單層全互連結構網路相同。在反饋型網路中的所有節點都具有信息處理功能,而且每個節點既可以從外界接受輸入,同時又可以向外界輸出。
⑨ 神經網路的分類
網路分類人工神經網路按其模型結構大體可以分為前饋型網路也稱為多層感知機網路)和反饋型網路(也稱為Hopfield網路)兩大類,前者在數學上可以看作是一類大規模的非線性映射系統,後者則是一類大規模的非線性動力學系統。它們的結構模型如圖1、圖2所示,圖中圓圏代表神經元,其間的有向連線代表神經元突觸。按照學習方式,人工神經網路又可分為有導師學習和無導師學習兩類;按工作方式則可分為確定性和隨機性兩類;按時間特性還可分為連續型或離散型兩類,等等。