⑴ 輕松體驗TensorFlow 第一個神經網路:基本分類(Part 1)
關於 Jupyter Notebook 的使用,可以參考如下鏈接,有詳細的步驟和截圖:
Jupyter Notebook神器-免費體驗來自微軟的Azure Notebook
基於Jupyter Notebook 快速體驗Python和plot()繪圖方法
基於Jupyter Notebook 快速體驗matplotlib.pyplot模塊中繪圖方法
TensorFlow 基本分類(basic classification)演示的完整代碼,可以訪問:
上述命令運行時間較長,請耐心等待。
pip list 命令用來查看當前環境下的Python 包,grep 命令用來查找和篩選。中間的豎線表示 pipe(管道),將pip list 命令的輸出作為 grep 命令的輸入。
pip 前面的感嘆號是cell 中運行 Linux 命令的方式,在命令行中運行則不需要加感嘆號。
上述命令的輸出,表示當前環境已經安裝好了 TensorFlow 包。如果沒有安裝,可以通過如下命令安裝:
安裝TensorFlow命令,說明如下:
本地安裝TensorFlow,截圖如下。
TensorFlow 安裝完成:
下面訓練了一個神經網路模型,來對服裝圖像進行分類,例如運動鞋和襯衫。需要使用tf.keras,這是一個用於在TensorFlow 中構建和訓練模型的高級API。
下面使用Fashion MNIST 數據集,其中包含了10個類別中共70,000張灰度圖像。圖像包含了低解析度(28 x 28像素)的單個服裝物品,圖片鏈接如下所示:
Fashion-MNIST是一個替代MNIST手寫數字集的圖像數據集。 它是由Zalando(一家德國的 時尚 科技 公司)旗下的研究部門提供。其涵蓋了來自10種類別的共7萬個不同商品的正面圖片。Fashion-MNIST的大小、格式和訓練集/測試集劃分與原始的MNIST完全一致。60000/10000的訓練測試數據劃分,28x28的灰度圖片。可以直接用它來測試你的機器學習和深度學習演算法性能,且不需要改動任何的代碼。
MNIST是 Mixed National Institute of Standards and Technology database 的簡寫。
下面使用60,000張圖像來訓練網路和10,000張圖像來評估網路模型學習圖像分類任務的准確程度。
可以直接從TensorFlow 使用Fashion MNIST,只需導入並載入數據。
載入數據集並返回四個NumPy數組:
圖像是28x28 NumPy數組,像素值介於0到255之間。labels是一個整數數組,數值介於0到9之間。
下面是圖像類別和標簽的對應關系:
每個圖像都映射到一個標簽。由於類別名稱不包含在數據集中,因此把他們存儲在這里以便在繪制圖像時使用:
以下顯示訓練集中有60,000個圖像,每個圖像表示為28 x 28像素:
訓練集中有 60000個標簽,並且每個標簽都是0-9 之間的整數。
測試集和訓練集類似,有10000個圖像和對應的10000個圖像標簽。
在訓練網路之前必須對數據進行預處理。 如果檢查訓練集中的第一個圖像,將看到像素值落在0到255的范圍內:
代碼說明:
plt.figure() 創建一個新的figure。
plt.colorbar() 方法用來顯示當前image 的顏色方案。
在發送到神經網路模型之前,我們將這些值縮放到0到1的范圍(歸一化處理)。為此,我們將像素值值除以255。重要的是,對訓練集和測試集要以相同的方式進行預處理:
顯示訓練集中的前25個圖像,並在每個圖像下方顯示類別名。驗證數據格式是否正確,我們是否已准備好構建和訓練網路。
代碼說明:
plt.xticks([])和plt.yticks([]) - 以空list 作為xticks() 方法的參數,查看數據集中圖像隱藏坐標軸。
plt.xlabel() 方法可以在 x 軸的下方顯示指定文本。
plt.subplot(5,5,1) 方法 - 表示5行5列共25個位置,最後一個參數1 表示Axes的位置,第一行的位置編號為:1-5,第二行的位置編號為:6-10,依此類推。
上述代碼遍歷了25 個位置(for i in range(25)),批量顯示多張圖。針對每一個位置,設置隱藏x和y軸,不顯示網關線(grid),在對應的位置顯示圖像以及類別(label)。
需要注意的地方:Axes 位置的起始值是1,不是常見的0。
對TensorFlow 深度學習有興趣的同學,可以訪問如下鏈接。
⑵ 怎麼用spss神經網路來分類數據
用spss神經網路分類數據方法如下:
神經網路演算法能夠通過大量的歷史數據,逐步建立和完善輸入變數到輸出結果之間的發展路徑,也就是神經網路,在這個神經網路中,每條神經的建立以及神經的粗細(權重)都是經過大量歷史數據訓練得到的,數據越多,神經網路就越接近真實。神經網路建立後,就能夠通過不同的輸入變數值,預測輸出結果。例如,銀行能夠通過歷史申請貸款的客戶資料,建立一個神經網路模型,用於預測以後申請貸款客戶的違約情況,做出是否貸款給該客戶的決策。本篇文章將用一個具體銀行案例數據,介紹如何使用SPSS建立神經網路模型,用於判斷將來申請貸款者的還款能力。
選取歷史數據建立模型,一般會將歷史數據分成兩大部分:訓練集和驗證集,很多分析者會直接按照數據順序將前70%的數據作為訓練集,後30%的數據作為驗證集。如果數據之間可以證明是相互獨立的,這樣的做法沒有問題,但是在數據收集的過程中,收集的數據往往不會是完全獨立的(變數之間的相關關系可能沒有被分析者發現)。因此,通常的做法是用隨機數發生器來將歷史數據隨機分成兩部分,這樣就能夠盡量避免相同屬性的數據被歸類到一個數據集當中,使得建立的模型效果能夠更加優秀。
在具體介紹如何使用SPSS軟體建立神經網路模型的案例之前,先介紹SPSS的另外一個功能:隨機數發生器。SPSS的隨機數發生器常數的隨機數據不是真正的隨機數,而是偽隨機數。偽隨機數是由演算法計算得出的,因此是可以預測的。當隨機種子(演算法參數)相同時,對於同一個隨機函數,得出的隨機數集合是完全相同的。與偽隨機數對應的是真隨機數,它是真正的隨機數,無法預測也沒有周期性。目前大部分晶元廠商都集成了硬體隨機數發生器,例如有一種熱雜訊隨機數發生器,它的原理是利用由導體中電子的熱震動引起的熱雜訊信號,作為隨機數種子。
⑶ 用最簡單的神經網路做數據分類,展示神經網路訓練過程
本文用簡單的神經網路做數據分類,展示神經網路訓練過程,伏薯方便理解缺鋒者
神經網路模型:Y = w1 x1 + w2 x2 + b
第一步 :生成訓練數據與標簽
第二步 :合並數據並將數據打亂,然後將數據轉換為Paddle框架基知所需要的數據類型
第三步 ,基於Paddle,構建神經網路、定義損失函數和優化器:Y = w1 x1 + w2 x2 + b
第四步 ,構建訓練過程
最後一步 ,繪制訓練結果
⑷ 神經網路的數據量多少比較合適
一般來說要1萬以上,越多越好,但要保證採集標准統一,且輸出為相同的數據不能太多。
⑸ 200組數據可以訓練神經網路嗎
不行
神經網路的數據需要1000個以上,其中訓練樣本至少700以上,驗證樣本至少300以上。
⑹ 神經網路分類問題
神經網路是新技術領域中的一個時尚詞彙。很多人聽過這個詞,但很少人真正明白它是什麼。本文的目的是介紹所有關於神經網路的基本包括它的功能、一般結構、相關術語、類型及其應用。
「神經網路」這個詞實際是來自於生物學,而我們所指的神經網路正確的名稱應該是「人工神經網路(ANNs)」。在本文,我會同時使用這兩個互換的術語。
一個真正的神經網路是由數個至數十億個被稱為神經元的細胞(組成我們大腦的微小細胞)所組成,它們以不同方式連接而型成網路。人工神經網路就是嘗試模擬這種生物學上的體系結構及其操作。在這里有一個難題:我們對生物學上的神經網路知道的不多!因此,不同類型之間的神經網路體系結構有很大的不同,我們所知道的只是神經元基本的結構。
The neuron
--------------------------------------------------------------------------------
雖然已經確認在我們的大腦中有大約50至500種不同的神經元,但它們大部份都是基於基本神經元的特別細胞。基本神經元包含有synapses、soma、axon及dendrites。Synapses負責神經元之間的連接,它們不是直接物理上連接的,而是它們之間有一個很小的空隙允許電子訊號從一個神經元跳到另一個神經元。然後這些電子訊號會交給soma處理及以其內部電子訊號將處理結果傳遞給axon。而axon會將這些訊號分發給dendrites。最後,dendrites帶著這些訊號再交給其它的synapses,再繼續下一個循環。
如同生物學上的基本神經元,人工的神經網路也有基本的神經元。每個神經元有特定數量的輸入,也會為每個神經元設定權重(weight)。權重是對所輸入的資料的重要性的一個指標。然後,神經元會計算出權重合計值(net value),而權重合計值就是將所有輸入乘以它們的權重的合計。每個神經元都有它們各自的臨界值(threshold),而當權重合計值大於臨界值時,神經元會輸出1。相反,則輸出0。最後,輸出會被傳送給與該神經元連接的其它神經元繼續剩餘的計算。
Learning
--------------------------------------------------------------------------------
正如上述所寫,問題的核心是權重及臨界值是該如何設定的呢?世界上有很多不同的訓練方式,就如網路類型一樣多。但有些比較出名的包括back-propagation, delta rule及Kohonen訓練模式。
由於結構體系的不同,訓練的規則也不相同,但大部份的規則可以被分為二大類別 - 監管的及非監管的。監管方式的訓練規則需要「教師」告訴他們特定的輸入應該作出怎樣的輸出。然後訓練規則會調整所有需要的權重值(這是網路中是非常復雜的),而整個過程會重頭開始直至數據可以被網路正確的分析出來。監管方式的訓練模式包括有back-propagation及delta rule。非監管方式的規則無需教師,因為他們所產生的輸出會被進一步評估。
Architecture
--------------------------------------------------------------------------------
在神經網路中,遵守明確的規則一詞是最「模糊不清」的。因為有太多不同種類的網路,由簡單的布爾網路(Perceptrons),至復雜的自我調整網路(Kohonen),至熱動態性網路模型(Boltzmann machines)!而這些,都遵守一個網路體系結構的標准。
一個網路包括有多個神經元「層」,輸入層、隱蔽層及輸出層。輸入層負責接收輸入及分發到隱蔽層(因為用戶看不見這些層,所以見做隱蔽層)。這些隱蔽層負責所需的計算及輸出結果給輸出層,而用戶則可以看到最終結果。現在,為免混淆,不會在這里更深入的探討體系結構這一話題。對於不同神經網路的更多詳細資料可以看Generation5 essays
盡管我們討論過神經元、訓練及體系結構,但我們還不清楚神經網路實際做些什麼。
The Function of ANNs
--------------------------------------------------------------------------------
神經網路被設計為與圖案一起工作 - 它們可以被分為分類式或聯想式。分類式網路可以接受一組數,然後將其分類。例如ONR程序接受一個數字的影象而輸出這個數字。或者PPDA32程序接受一個坐標而將它分類成A類或B類(類別是由所提供的訓練決定的)。更多實際用途可以看Applications in the Military中的軍事雷達,該雷達可以分別出車輛或樹。
聯想模式接受一組數而輸出另一組。例如HIR程序接受一個『臟』圖像而輸出一個它所學過而最接近的一個圖像。聯想模式更可應用於復雜的應用程序,如簽名、面部、指紋識別等。
The Ups and Downs of Neural Networks
--------------------------------------------------------------------------------
神經網路在這個領域中有很多優點,使得它越來越流行。它在類型分類/識別方面非常出色。神經網路可以處理例外及不正常的輸入數據,這對於很多系統都很重要(例如雷達及聲波定位系統)。很多神經網路都是模仿生物神經網路的,即是他們仿照大腦的運作方式工作。神經網路也得助於神經系統科學的發展,使它可以像人類一樣准確地辨別物件而有電腦的速度!前途是光明的,但現在...
是的,神經網路也有些不好的地方。這通常都是因為缺乏足夠強大的硬體。神經網路的力量源自於以並行方式處理資訊,即是同時處理多項數據。因此,要一個串列的機器模擬並行處理是非常耗時的。
神經網路的另一個問題是對某一個問題構建網路所定義的條件不足 - 有太多因素需要考慮:訓練的演算法、體系結構、每層的神經元個數、有多少層、數據的表現等,還有其它更多因素。因此,隨著時間越來越重要,大部份公司不可能負擔重復的開發神經網路去有效地解決問題。
Conclusion
--------------------------------------------------------------------------------
希望您可以通過本文對神經網路有基本的認識。Generation5現在有很多關於神經網路的資料可以查閱,包括文章及程序。我們有Hopfield、perceptrons(2個)網路的例子,及一些back-propagation個案研究。
Glossary
--------------------------------------------------------------------------------
NN 神經網路,Neural Network
ANNs 人工神經網路,Artificial Neural Networks
neurons 神經元
synapses 神經鍵
self-organizing networks 自我調整網路
networks modelling thermodynamic properties 熱動態性網路模型
⑺ 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神經網路只有一類樣本怎麼分類
神經網路一列為一個樣本,所以對於matlab 而言,要求輸入和輸出的列數必須一樣的
經常有人問起的問題:
Error using ==> network/train
Targets are incorrectly sized for network.
Matrix must have 1 rows.
解決:要求P T 的列數一樣 ,如果不一樣 P=p』 t=t』 轉置一下
2.
歸一
澄清一個對歸一的錯誤理解1
樣本矩陣為9行4列。9組樣本,4個變數。現在歸一化:
x=[68.7 66.6 5610 19.2;
89.9 90.8 4500 11.8;
120.8 120.6 6800 20.6;
169 40.4 6160 40.6;
180.8 69.8 7330 33.4;
190.3 130.2 7320 31.6;
109.8 151.1 5754 86.1;
33.2 61.4 8255 22.6;
111.7 126.6 7040 13.6;]
寫法一:
for i=1:9
x1(i,:)=(x(i,:)-min(x(i,:)))/(max(x(i,:))-min(x(i,:)))
end
結果:
0.0089 0.0085 1.0000 0
0.0174 0.0176 1.0000 0
0.0148 0.0148 1.0000 0
0.0210 0 1.0000 0.0000
0.0202 0.0050 1.0000 0
0.0218 0.0135 1.00 00 0
0.0042 0.0115 1.0000 0
0.0013 0.0047 1.0000 0
0.0140 0.0161 1.0000 0
寫法二:
x=x'
for i=1:4
x1(i,:)=(x(i,:)-min(x(i,:)))/(max(x(i,:))-min(x(i,:)))
end
結果:
Columns 1 through 8
0.2260 0.3609 0.5576 0.8644 0.9395 1.0000 0.4876 0
0.2367 0.4553 0.7245 0 0.2656 0.8112 1.0000 0.1897
0.2956 0 0.6125 0.4421 0.7537 0.7510 0.3340 1.0000
0.0996 0 0.1184 0.3876 0.2907 0.2665 1.0000 0.1454
Column 9
0.4997
0.7787
0.6764
0.0242
注意:寫法2為正確的歸一化
對歸一的錯誤理解2
將數據集分為訓練集和測試集,對訓練集和測試集分別做歸一處理
所以就會有人問 如果我的測試集只有一個數據 如何歸一呀
最大最小值從那裡找呀
正確的理解是:
訓練集和測試集的歸一標準是一樣的
建議:
如果訓練集和測試集是一起歸一的 可以自己編程實現歸一
如果是訓練集和測試集是分開的,最好是使用matlab自帶的premnmx、postmnmx、tramnmx 函數
如果是自己編程的話 ,請注意訓練集和測試集的歸一標准需要一樣
premnmx、postmnmx、tramnmx 函數
的使用例子如下:
Example
Here is the code to normalize a given data set so
that the inputs and targets will fall in the
range [-1,1], using PREMNMX, and the code to train a network
with the normalized data.
p = [-10 -7.5 -5 -2.5 0 2.5 5 7.5 10];
t = [0 7.07 -10 -7.07 0 7.07 10 7.07 0];
[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t);
net = newff(minmax(pn),[5 1],{'tansig' 'purelin'},'trainlm');
net = train(net,pn,tn);
If we then receive new inputs to apply to the trained
network, we will use TRAMNMX to transform them
first. Then the transformed inputs can be used
to simulate the previously trained network. The
network output must also be unnormalized using
POSTMNMX.
p2 = [4 -7];
[p2n] = tramnmx(p2,minp,maxp);
an = sim(net,pn);
[a] = postmnmx(an,mint,maxt);
這個是歸一到-1 和 1 之間 那我要歸一到0 1 之間怎麼辦
有人說可以使用加絕對值就歸一到 0 1之間了
我覺得加絕對值可能會有些問題
比較好的方式是變換
P 在-1 1 之間
Pp=(p+1)/2 就可以歸一到0 1之間
至於要歸一到0.1- 0.9 之間 選取合適的變換就可以做到了
二、神經網路(BP)系列(2)(初學者系列)每次結果不一樣解析
這個系列主要針對使用matlab 神經網路工具箱,對一些初學者容易理解錯誤的地方進行解析。
神經網路每次結果不同解析
神經網路每次結果不同是因為初始化的權值和閾值是隨機的
因為每次的結果不一樣,才有可能找到比較理想的結果啊
找到比較好的結果後,用命令save filename net;保存網路,
可使預測的結果不會變化,調用時用命令load filename net;
取p_test=[ ];
t_test=[ ];
t=sim(net,p_test);
err=t_test-t;
plot(p_test,err);
選擇誤差小的保存網路
save filename net
以後調用時
load filename net
p_test=[ ];
t_test=[ ];
t=sim(net,p_test);
err=t_test-t;
plot(p_test,err):
因為每次初始化網路時都是隨機的,而且訓練終止時的誤差也不完全相同,結果訓練後的權植和閥也不完全相同(大致是一樣的),所以每次訓練後的結果也略有不同
舉個例子,這樣初始化就能使網路的輸出結果是一樣的,另外也可以給網路特定的權值,一種方法是把預測結果後的效果比較好的權值做為初值
p=[0.8726 0.9441 0;0 0 0.7093;0.7378 0.7093 0.3795;0.6416 0.3795 0.7031;1 0.7031 0.4241;0.7774 0.4241 0.9559;0.9559 0.5012 0.7052;...
0.8209 0.7052 0.4983;0.6011 0.4983 1;]';
t=[0 0.7378 0.6416 1 0.7774 0.5012 0.8209 0.6011 0.9350];
rand('state',0);
net=newff(minmax(p),[6,1],{'tansig','logsig'},'trainlm');
net.trainParam.epochs=2000;
net.trainParam.goal=0.001;
net=train(net,p,t);
y=sim(net,p);
error=y-t;
res=norm(error);
p_test=[0.9350 1 0.6236;]';
t_test=[ 0.8027]
a=sim(net,p_test)
rand('state',0);
這個的作用是每次初始化一樣
0是種子數,如果換成其他數,就可以產生不同的隨機值
注: rand('state',0);的使用有點為結果相同而相同,至於這樣的結果網路性能是否達到好的要求則沒有考慮,建議還是不要用這種方法使每次結果相同
用保存網路的方法吧
消除初值影響可以考慮的另一個方法是簡單集成神經網路
原理
由於選擇不同的權值所得結果不同,使最終神經網路泛化能力體現出一定的隨機性。利用這個特性也可以改善神經網路的泛化能力,神經網路集成便是利用這種思路的體現,即先訓練一組只有初始權值不同的子網,然後通過各子網「表決(Voting)」 的形式(如加權和)得到學習系統的輸出。
當神經網路集成用於分類器時,集成的輸出通常由個體網路的輸出投票產生。通常利用絕對多數投票法(某分類成為最終結果當且僅當輸出結果為該分類的神經網路的數目最多)。理論分析和大量實驗表明,後者優於前者。因此,在對分類器進行集成時,目前大多採用相對多數投票法。
當神經網路集成用於回歸估計時,集成的輸出通常由各網路的輸出通過簡單平均或加權平均產生。Perrone等人認為,採用加權平均可以得到比簡單平均更好的泛化能力。
三、神經網路(BP)系列(3)(初學者請看)分類實例
分類實例
輸入輸出設計:
對某一問題分析,影響網路性能的輸入主要有5個指標,輸出則分為8類。8類的話可以用三位二進製表示。
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
神經網路的輸入為5維的向量,輸出為三維的向量。輸入的數據具有不同的單位和量級,所以在輸入在輸入神經網路之前應該首先進行歸一化處理,將樣本數據歸一到0 1之間。
樣本總共有328組數據
將樣本集分為訓練集和測試集
隨機抽取70取做為測試測試集
其餘的作為訓練集
網路設計
採用tansig(x)和logsig(x)函數作為傳輸函數,tansig(x)如下式:
tansig=2/(1+exp(-2x))-1
logsig(x) 如下式:
logsig(x) = 1 / (1 + exp(-n))
對於有限個輸入到輸出的映射,並不需要無限個隱層節點,這就涉及到如何選擇隱層節點數的問題,而這一問題的復雜性,使得至今為止尚未找到一個很好的解析 式,隱層節點數往往根據前人設計所得的經驗和自己進行試驗來確定。設計網路時我採用的方法是通過神經網路訓練來確定隱含層的個數,首先確定隱含層中節點數目的范圍,設計一個隱含層神經元數目可變的BP網路,通過誤差對比,確定最佳的隱含層神經元的個數。最後確定的隱含層的個數為12。所以網路結構為 5-12-3的三層結構。
load('CSHuju1.mat');
p=CC1(:,[1,3:6])';
T=[0 0 0;
1 1 1;
1 1 0;
1 0 1;
1 0 0;
0 1 1;
0 1 0;
0 0 1];
t=repmat(T,41,1)';
pp=p;
%%%%%%歸一到 0 1 之間
for i=1:5
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
AllSamNum=328;%總樣本數
TrainSamNum=258;%訓練樣本數
TestSamNum=AllSamNum-TrainSamNum;%測試樣本數
PerPos=randperm(AllSamNum);
TrainDataIn=p(:,1:TrainSamNum)
TrainDataOut=t(:,1:TrainSamNum)
TestDataIn=p(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
TestDataOut=t(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
MaxMin=[0 1; 0 1; 0 1; 0 1;0 1];
net=newff(MaxMin,[12,3],{'tansig','logsig'},'trainlm');
%訓練參數設置
net.trainParam.epochs=1000;
%訓練次數
net.trainParam.goal=0.0001;
%訓練結束的目標
LP.lr=0.1;
%學習率
net.trainParam.show=20;
net=train(net,TrainDataIn,TrainDataOut);
out=sim(net,TestDataIn)
訓練結果:
TRAINLM, Epoch 0/1000, MSE 0.296308/0.0001, Gradient 83.9307/1e-010
TRAINLM, Epoch 20/1000, MSE 0.0224641/0.0001, Gradient 6.7605/1e-010
TRAINLM, Epoch 40/1000, MSE 0.00563627/0.0001, Gradient 3.27027/1e-010
TRAINLM, Epoch 60/1000, MSE 0.00348587/0.0001, Gradient 1.49868/1e-010
TRAINLM, Epoch 80/1000, MSE 0.00247714/0.0001, Gradient 0.459233/1e-010
TRAINLM, Epoch 100/1000, MSE 0.0018843/0.0001, Gradient 0.289155/1e-010
TRAINLM, Epoch 120/1000, MSE 0.00148204/0.0001, Gradient 0.392871/1e-010
TRAINLM, Epoch 140/1000, MSE 0.00119585/0.0001, Gradient 0.340864/1e-010
TRAINLM, Epoch 160/1000, MSE 0.000980448/0.0001, Gradient 0.391987/1e-010
TRAINLM, Epoch 180/1000, MSE 0.000779059/0.0001, Gradient 0.389835/1e-010
TRAINLM, Epoch 200/1000, MSE 0.000606974/0.0001, Gradient 0.310202/1e-010
TRAINLM, Epoch 220/1000, MSE 0.000388926/0.0001, Gradient 0.331632/1e-010
TRAINLM, Epoch 240/1000, MSE 0.000143563/0.0001, Gradient 0.0403953/1e-010
TRAINLM, Epoch 248/1000, MSE 9.87756e-005/0.0001, Gradient 0.174263/1e-010
TRAINLM, Performance goal met.
訓練好的權值、閾值的輸出方法是:
輸入到隱層權值:w1=net.iw{1,1}
隱層閾值:theta1=net.b{1}
隱層到輸出層權值:w2=net.lw{2,1};
輸出層閾值:theta2=net.b{2}
>>w1=net.iw{1,1}
w1 =
1.7663 -2.8022 -0.7142 -2.1099 -2.4011
3.6614 -2.5297 -4.4295 5.0508 8.1899
4.4007 7.6775 -6.0282 6.1567 1.8775
4.5009 -9.9915 5.9737 5.0234 3.3931
0.2703 -2.8850 0.4482 -2.9153 1.3648
2.3769 3.3151 0.8745 3.1900 1.2608
-2.2815 -6.6847 1.8738 2.4093 -2.9033
-5.3332 6.1506 -8.4386 -6.7979 3.1428
-0.0135 -10.8942 -9.6333 7.2311 12.0693
2.3130 5.2211 0.0155 2.9431 0.3135
-6.4017 -0.8987 0.1976 3.2527 0.1444
-3.6517 -1.6339 3.5505 2.4813 1.7880
>> theta1=net.b{1}
theta1 =
0.5955
-5.4876
-9.8986
-4.4731
3.6523
-4.0371
5.6187
5.7426
0.9147
-8.5523
-2.3632
-5.6106
>> w2=net.lw{2,1}
w2 =
Columns 1 through 8
-0.2751 -3.5658 -2.3689 -6.4192 -1.1209 1.5711 -1.7615 7.6202
-1.2874 -9.1588 -14.4533 7.5064 3.7074 0.9019 8.7033 -5.0031
3.3536 -0.8844 7.8887 0.9336 0.8410 -2.4905 1.0627 -9.3513
Columns 9 through 12
-2.5894 -1.9950 -3.0132 -4.7009
13.3490 -9.8521 -4.6680 -4.2037
-5.9251 2.9388 -1.6797 -2.1077
>> theta2=net.b{2}
theta2 =
-2.4762
0.5692
0.6694
輸出:
out =
Columns 1 through 8
1.0000 1.0000 0.0020 0.0000 1.0000 1.0000 0.0000 0.0000
1.0000 0.0000 0.0041 1.0000 1.0000 1.0000 1.0000 1.0000
0.9991 0.0000 0.0036 0.0015 0.9992 0.9985 0.0055 0.0036
Columns 9 through 16
1.0000 0.0000 0.0019 1.0000 0.0000 0.0000 0.0000 0.9996
1.0000 1.0000 0.9901 1.0000 1.0000 1.0000 1.0000 0.0000
0.9977 0.9999 0.9996 0.9994 0.0046 0.0023 0.0014 1.0000
Columns 17 through 24
0.0020 0.9925 0.0020 0.0000 0.0020 1.0000 0.0002 1.0000
0.0041 0.0284 0.0041 0.0284 0.0041 1.0000 0.9983 1.0000
0.0036 0.9955 0.0036 1.0000 0.0036 0.9989 0.9999 0.9990
Columns 25 through 32
1.0000 0.9938 1.0000 0.0000 1.0000 0.9999 0.0000 1.0000
1.0000 0.0177 0.0000 0.0021 1.0000 0.0006 1.0000 1.0000
0.0000 0.9971 0.0000 1.0000 0.0000 0.0004 0.9999 0.0000
Columns 33 through 40
0.9954 1.0000 0.0000 0.0000 0.9951 0.0020 0.0000 0.9997
0.0065 1.0000 1.0000 0.0025 0.0178 0.0041 1.0000 0.0000
0.9986 0.9990 0.9999 1.0000 0.0101 0.0036 0.0013 1.0000
Columns 41 through 48
0.0000 1.0000 0.9983 0.0000 0.0020 1.0000 0.0000 0.9873
0.0020 1.0000 0.0000 0.0037 0.0041 1.0000 0.0328 0.0637
1.0000 0.0000 0.9999 1.0000 0.0036 0.9982 1.0000 0.9884
Columns 49 through 56
0.0000 0.0001 1.0000 1.0000 1.0000 0.0000 0.0004 1.0000
0.0164 0.9992 0.9982 1.0000 1.0000 1.0000 0.9965 0.9998
1.0000 0.9999 0.9948 0.9991 0.9989 0.0024 0.9998 0.9968
Columns 57 through 64
1.0000 1.0000 0.0000 0.0020 0.0020 0.0001 0.0001 0.0000
0.9763 1.0000 0.0134 0.0041 0.0041 0.9990 0.0395 0.0017
0.0202 0.9988 1.0000 0.0036 0.0036 0.9999 0.9999 1.0000
Columns 65 through 70
0.9993 0.0000 0.0000 0.9978 1.0000 1.0000
0.0000 0.0018 0.0110 0.0001 1.0000 0.9998
1.0000 1.0000 1.0000 0.9999 0.9987 0.0007
每次結果因為初始化不同會不一樣,可以選取一個性能比較好的網路
保持起來
save myBpNet net
save myShu.mat TestDataIn TestDataOut
測試數據也保存起來
(TestDataIn TestDataOut 為測試數據的輸入向量和目標向量)
以後調用時
load myshu.mat
load myBpNet net
out=sim(net,TestDataIn)
基本框架程序:(前面的樣本數據自己根據實際情況設計)
load('CSHuju1.mat');
p=CC1(:,[1,3:6])';
T=[0 0 0;
1 1 1;
1 1 0;
1 0 1;
1 0 0;
0 1 1;
0 1 0;
0 0 1];
t=repmat(T,41,1)';
pp=p;
%%%%%%歸一到 0 1 之間
for i=1:5
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
AllSamNum=328;%總樣本數
TrainSamNum=258;%訓練樣本數
TestSamNum=AllSamNum-TrainSamNum;%測試樣本數
PerPos=randperm(AllSamNum);
TrainDataIn=p(:,1:TrainSamNum)
TrainDataOut=t(:,1:TrainSamNum)
TestDataIn=p(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
TestDataOut=t(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
MaxMin=[0 1; 0 1; 0 1; 0 1;0 1];
net=newff(MaxMin,[12,3],{'tansig','logsig'},'trainlm');
net.trainParam.epochs=1000;
%訓練次數
net.trainParam.goal=0.0001;
%訓練結束的目標
LP.lr=0.1;
%學習率
net.trainParam.show=20;
net=train(net,TrainDataIn,TrainDataOut);
out=sim(net,TestDataIn)
⑼ 人工神經網路分析需要樣本量一般多大
1.樣本量的確定是費用與精度的函數,取決於研究的精度和費用,特別是實踐中費用考慮的更多!
2.抽樣調查,特別是隨機抽樣,樣本有代表性,往往比普查更有效率,甚至精度更高,這里我們主要計算和討論抽樣誤差,非抽樣誤差是人為因素,考質量控制;
3.樣本量的確定有賴於隨機抽樣,或者說主要是針對隨機抽樣,需要統計推斷下的計算樣本量,如果是非概率抽樣,理論上沒有計算和控制樣本量的問題;
4.如果研究只要40-50個樣本,感覺上應該是非概率抽樣(依賴被訪者選擇方式)
5.即使是非概率抽樣,我們很多時候也採用概率和統計分析及推斷思想來進行數據分析和下結論!只是這種方法沒有完善的理論支持,或者說有可能因為研究者的主觀判斷失誤造成偏差;
6.無論是概率抽樣還是非概率抽樣,樣本量越大當然效果越好,結論越穩定(理論上說)
7.40-50個樣本在統計上屬於小樣本,t-檢驗,如果樣本大於60或理想120以上,t分布就是正態分布了,所以40個樣本在統計上是最小推斷總體的樣本,換句話說40-50個樣本是介於小樣本和正態分布大樣本的臨界樣本量;如果不嚴格的話40個樣本就可以比較總體之間的統計差異了;
8.所以,一般來講,針對一個研究對象和人群,要進行比較最少40個樣本,比如男女差異,應該各擁有40人(80人),或者說你們進行配額樣本的時候要保證統計比較的類別至少有40個樣本;
9.那麼40個樣本有代表性嗎? 當然越多越好,越有代表性
10.但如果調查對象非常一致,沒有差異,只要問一個人就行了,所以要考慮研究對象的差異性,如果差異大,當然樣本量要大,如果沒有差異,同質性較高樣本量就少;
11.總體的大小對樣本量的選擇沒有影響,調查研究一般必須在研究前明確總體是誰,大總體沒有影響(上萬人),中等總體有點影響(5000人),小總體有很大影響(千百個人);總體是你要推斷的人群;
12.再者要考慮研究對象在總體中擁有的比例(比如要找艾滋病人),如果比例非常低的話,需要大樣本才能找到;但往往商業研究就採用非概率抽樣了,比如滾雪球抽樣,專家判斷抽樣,配額抽樣等;
13.另外,選擇40個人,如果是經過我們主觀判斷的,有一種說法:叫條件概率,也就是我們越了解研究目的和對象,我們就越能夠做出正確判斷;比如P(A|B),也就是說我們越了解B事件發生的概率,那麼A發生的概率就越確定;就像我們在Google中搜東西,你的關鍵詞=B越准確,得到的結果A就越是你想要的東西;
14.當然,如果你的主觀判斷錯了,就會犯更大的錯誤
15.還有就是希望得到的精度;如果得到的結果是70%加減10%誤差我們可以接受,但如果是總體本身就不到8%,那8%加減10%,尾巴比頭都大顯然不行,當然到底如何確定精度,是研究前你們與客戶要明確的,事先研究設計確定的,不能事後來說;
16.記住:有時候我們研究本身不需要那麼高的精度
17.整個研究設計過程的質量控制可以更有效提升研究品質
18.研究測試的技術(接近自然科學儀器測量)可獲得更好研究品質
19.根據精確的抽樣,需要採用精確的統計分析,否則也達不到效果
20.任何研究都不會完美,都是權衡和保守的過程,總的來講保守不犯錯
21.如果研究有實驗設計和研究設計,所以實驗設計,包括所謂雙盲實驗、正交設計、拉丁方格等,確定樣本分組是非常精細的,有助於研究品質;但設計缺陷會造成降低品質;
22.處置組和對照組的設計,主要應用在傳播效果、廣告效果研究上,需要有設計原則
23.實驗設計也強調對其它影響因素的控制,也就是X對Y的影響,要控制住Z的干擾,更能提高研究品質
24.被訪者的參與度(你的激勵方式)也重要,一分錢一分貨;我們是花錢買信息
25.任何理由都是可解釋的,但這里主要是要用術語,越專業越說行話,別人更相信,所以解釋樣本量的科學性,有時候要用科學,也就是理論;
26.因為有理論,顯得有水平,因為有水平就有話語權,就有執行力!所以權威部門的設計或出面,客戶就相信了!
27.研究過程,不斷修正,比如追加樣本也是解決問題的辦法
28.連續性研究,也會解決或減少對樣本量的需求
29.廣告效果研究經常採用rolling data的方式,因為廣告效果有延遲效應,每周50個樣本,4周一個分析,就是200樣本,第五周分析前4周,第六周分析2-5周數據,進行比較和檢驗,這是常有方法;
⑽ BP神經網路數據400組少嗎
少。
如果你的數據具有非常復雜的對應關系,比如現在你分類到博彩類,用神經網路理論上講是可以預測的的,很多人發了論文,講怎麼用神經網路預測雙色球什麼的。實際上效果並不是非常理想。因為內在規律太復雜,有限的數據無法透徹的歸納出來到底數據怎麼變化。這種情況下,縱使你又幾千個數據也不行。比較保險的辦法還是用逆向工程方法建立一個一個的子模型,然後整理成一個大模型再做預測。往往會比因為數據量不夠引起的神經網路預測誤差要小得多。