Ⅰ 神經網路處理數據組有1000個維數需要多少輸入節點
這需要看你的實際需求了,一般使用二次型就行,這樣的話輸入節點1000!個,維度這么大我想應該有很大數據是冗餘的,可以先用PCA降低下維度1000維度(通道)有點誇張,還是說只是單維度下,有連續1000個輸入作為一組樣本
Ⅱ 神經網路的隱層數,節點數設置。
我自己總結的:
1、神經網路演算法隱含層的選取
1.1 構造法
首先運用三種確定隱含層層數的方法得到三個隱含層層數,找到最小值和最大值,然後從最小值開始逐個驗證模型預測誤差,直到達到最大值。最後選取模型誤差最小的那個隱含層層數。該方法適用於雙隱含層網路。
1.2 刪除法
單隱含層網路非線性映射能力較弱,相同問題,為達到預定映射關系,隱層節點要多一些,以增加網路的可調參數,故適合運用刪除法。
1.3黃金分割法
演算法的主要思想:首先在[a,b]內尋找理想的隱含層節點數,這樣就充分保證了網路的逼近能力和泛化能力。為滿足高精度逼近的要求,再按照黃金分割原理拓展搜索區間,即得到區間[b,c](其中b=0.619*(c-a)+a),在區間[b,c]中搜索最優,則得到逼近能力更強的隱含層節點數,在實際應用根據要求,從中選取其一即可。
Ⅲ 神經網路一個隱含層通常有幾個節點數阿
一個最簡單的分類,是在平面上畫一條直線,左邊為類0,右邊為類1,直線表示為
這是一個分類器,輸入(x,y),那麼,要求的參數有三個:a,b,c。另外注意c的作用,如果沒有c,這條直線一定會過原點。
因此,我們可以設計一個簡單的神經網路,包含兩層,輸入層有三個節點,代表x,y,1,三條線分別代表a,b,cg(z)對傳入的值x進行判別,並輸出結果。
但是,由於z的值可能為[],為了方便處理,需要將其壓縮到一個合理的范圍,還需sigmoid函數:
這樣的激勵函數,能夠將剛才的區間,壓縮到
Ⅳ BP神經網路分類 三個輸入兩個輸出,隱含層應選多少層,節點數多少為宜 還有訓練次數什麼的需要專門設置
現在還沒有什麼成熟的定理能確定各層神經元的神經元個數和含有幾層網路,大多數還是靠經驗,不過3層網路可以逼近任意一個非線性網路,神經元個數越多逼近的效果越好。
Ⅳ matlab神經網路訓練一般需要多少數據
你這個問題真的不好回答,因為沒有固定答案,也沒有什麼經驗答案,不能太少也不能太多,因為需要根據實際情況決定了,看你是要做什麼了
Ⅵ 神經網路是不是隱含層節點數越多越好
不一定,神經網路的結構與問題本身有關,太少了,模型不準確,太多了,會出現過擬合的現象;
在目前也沒有一個標准,可以試著從簡到繁。
Ⅶ 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 網路中,隱層節點數的選擇非常重要,它不僅對建立的神經網路模型的性能影響很大,而且是訓練時出現「過擬合」的直接原因,但是目前理論上還沒有一種科學的和普遍的確定方法。 目前多數文獻中提出的確定隱層節點數的計算公式都是針對訓練樣本任意多的情況,而且多數是針對最不利的情況,一般工程實踐中很難滿足,不宜採用。事實上,各種計算公式得到的隱層節點數有時相差幾倍甚至上百倍。為盡可能避免訓練時出現「過擬合」現象,保證足夠高的網路性能和泛化能力,確定隱層節點數的最基本原則是:在滿足精度要求的前提下取盡可能緊湊的結構,即取盡可能少的隱層節點數。研究表明,隱層節點數不僅與輸入/輸出層的節點數有關,更與需解決的問題的復雜程度和轉換函數的型式以及樣本數據的特性等因素有關。在確定隱層節點數時必須滿足下列條件:(1)隱層節點數必須小於N-1(其中N為訓練樣本數),否則,網路模型的系統誤差與訓練樣本的特性無關而趨於零,即建立的網路模型沒有泛化能力,也沒有任何實用價值。同理可推得:輸入層的節點數(變數數)必須小於N-1。 (2) 訓練樣本數必須多於網路模型的連接權數,一般為2~10倍,否則,樣本必須分成幾部分並採用「輪流訓練」的方法才可能得到可靠的神經網路模型。 總之,若隱層節點數太少,網路可能根本不能訓練或網路性能很差;若隱層節點數太多,雖然可使網路的系統誤差減小,但一方面使網路訓練時間延長,另一方面,訓練容易陷入局部極小點而得不到最優點,也是訓練時出現「過擬合」的內在原因。因此,合理隱層節點數應在綜合考慮網路結構復雜程度和誤差大小的情況下用節點刪除法和擴張法確定。
Ⅸ 神經網路節點數
輸入向量維數=輸入層節點數輸出向量維數=輸出層節點數看來你是做三層網路,只有一個隱藏層。隱藏層節點數,傳遞函數選擇都是開放課題。看你要解決什麼問題。如果簡單做demo,就自己嘗試就可以了。
Ⅹ 什麼是神經網路的節點數
隱層節點數
在BP 網路中,隱層節點數的選擇非常重要,它不僅對建立的神經網路模型的性能影響很大,而且是訓練時出現「過擬合」的直接原因,但是目前理論上還沒有一種科學的和普遍的確定方法。 目前多數文獻中提出的確定隱層節點數的計算公式都是針對訓練樣本任意多的情況,而且多數是針對最不利的情況,一般工程實踐中很難滿足,不宜採用。事實上,各種計算公式得到的隱層節點數有時相差幾倍甚至上百倍。為盡可能避免訓練時出現「過擬合」現象,保證足夠高的網路性能和泛化能力,確定隱層節點數的最基本原則是:在滿足精度要求的前提下取盡可能緊湊的結構,即取盡可能少的隱層節點數。研究表明,隱層節點數不僅與輸入/輸出層的節點數有關,更與需解決的問題的復雜程度和轉換函數的型式以及樣本數據的特性等因素有關。
在確定隱層節點數時必須滿足下列條件:
(1)隱層節點數必須小於N-1(其中N為訓練樣本數),否則,網路模型的系統誤差與訓練樣本的特性無關而趨於零,即建立的網路模型沒有泛化能力,也沒有任何實用價值。同理可推得:輸入層的節點數(變數數)必須小於N-1。
(2) 訓練樣本數必須多於網路模型的連接權數,一般為2~10倍,否則,樣本必須分成幾部分並採用「輪流訓練」的方法才可能得到可靠的神經網路模型。
總之,若隱層節點數太少,網路可能根本不能訓練或網路性能很差;若隱層節點數太多,雖然可使網路的系統誤差減小,但一方面使網路訓練時間延長,另一方面,訓練容易陷入局部極小點而得不到最優點,也是訓練時出現「過擬合」的內在原因。因此,合理隱層節點數應在綜合考慮網路結構復雜程度和誤差大小的情況下用節點刪除法和擴張法確定。