bp(back propagation)表示反向傳播。bp網路能學習和存貯大量的輸入-輸出模式對映關係,而無需事前揭示描述這種對映關係的數學
方程。它的學習規則是使用最速下降法,通過反向傳播來不斷調整網路的權值和閾值,使網路的誤差平方和最小。bp神經網路模型拓撲結構包括輸入層(input)、隱層(hidden layer)和輸出層(output layer)。
圖1 三層bp網
如圖所示,最下面一層為輸入層,中間為隱藏層,最上面為輸出層。其中x=,y=,o=為向量,w、v為權值矩陣,v的行的數目跟y的長度相等,v的列的數目跟x的長度相等。w的行的數目跟o的長度相等,w的列的數目跟y的長度相等。
對於低層到高層的每乙個節點,做如下的運算:
圖2 sigmoid閾值單元
x1,x2....xn表示該層的輸入,比如在輸入層到隱藏層中,它們表示圖1中的x0,x1.....xn;在隱藏層到輸出層,它們表示y0,y1.....ym。w1,w2...wn表示該層的權值,並不只對應圖1中的w。
之所以用sigmoid函式,原因如上圖所示。它的導數可以用它的輸出表示,這樣在求梯度的時候很容易計算,而且這個函式與感知器相似。
bp神經網路的原理就是不斷的訓練,不停地去改變w和v的權值,然後把期望的結果可輸出的o比較,當誤差收斂到一定範圍就可以終止訓練。
影象需要進行一定的處理:灰度轉化->二值化->影象銳化->去除雜訊->歸一化
灰度轉化和二值化可參考:
影象銳化和去除雜訊可以通過濾波來解決,具體過程搜尋一下。
歸一化就是把影象調整到固定大小。我是用5x5的矩陣來儲存歸一化後的影象。比如5可以用
表示。即:
輸入為一定數量的5x5的矩陣,可以用乙個長度為25的向量表示,所以輸入層長度為25,隱藏層的節點數不一定,通常可以用(n+1)的1/2次方+a算出(n表示輸入的向量的長度,a可以取0~輸出向量的長度之間的數),我的隱藏層使用15個節點。
訓練演算法如下:
**實現如下:
for (int j = 0; j < y.count(); j++)
for (int k = 0; k < o.count(); k++)
for (int k = 0; k < o.count(); k++)
for (int h = 0; h < y.count(); h++)
errortermh[h] = y[h] * (1 - y[h]) * sum;
}for (int j = 0; j < w.getlength(0); j++)
}for (int j = 0; j < v.getlength(0); j++)
}
**中的w、v、o、x、y分別對應圖1中的相應向量和矩陣。
sigmoid函式和net函式定義如下:
private double sigmoid(double x)
private double net(int j,double[,] v, double x)
return sum;
}
同樣的樣本也需要多次訓練。
我用10個代表0~9的矩陣不停的訓練,輸出的o的值如下圖所示:
可以看出,o[8]的值最大,接近1,接近期望輸出的向量,代表該數字為8.
當然,訓練的時候肯定不能用乙個樣本訓練,需要輸入很多樣本,通常需要進行上千次訓練,每個樣本可以參與多次訓練。
當輸出與期望輸出的誤差收斂到一定範圍,就可以停止訓練。
把需要識別的影象處理成5x5的矩陣,輸入到bp網路中,輸出矩陣o,o中值最大的那個元素的位置即為識別出的數字。但是如果o中最大的值小於一定的閾值,可以判斷為無法判斷。
人工智慧 BP神經網路(數字識別)
摘要 構造乙個三層的 bp 神經網路,完成手寫 0 9 數字的識別。設計網路的結構,比如層數,每層的神經元數,單個神經元的輸入輸出函式 根據數字識別的任務,設計網路的輸入和輸出 實現 bp 網路的錯誤反傳演算法,完成神經網路的訓練和測試,最終識別率達到 70 以上 bp 演算法思想流程 初始化輸入訓...
BP神經網路(基於MATLAB)
clc clear all 匯入資料 load s data.mat s含量所用資料 n 12 n 是自變數的個數 m 1 m 是因變數的個數 讀取訓練資料 train num 1600 訓練樣本數 train data s data 1 train num,特徵值歸一化 train input,m...
基於BP神經網路的分類
使用的是乙個簡單的資料集fisheriris,該資料集資料類別分為3類,setosa,versicolor,virginica。每類植物有50個樣本,共150個樣本代表150朵花瓣。每個樣本有4個屬性,分別為花萼長,花萼寬,花瓣長,花瓣寬。其中meas是150 4的矩陣代表著有150個樣本每個樣本有...