基於神經網路的模式識別

2021-09-25 01:49:43 字數 3817 閱讀 1935

實驗目的

理解bp神經網路和離散hopfield神經網路的結構和原理

掌握反向傳播學習演算法對神經元的訓練過程,了解反向傳播公式

通過構建bp網路和離散hopfield網路模式識別例項,熟悉前饋網路和反饋網路的原理及結構

通過編寫源**理解基於神經網路的模式識別

bp神經網路**

#include #include #include #include #include #include #include #include #include #include using namespace std;

#define train_cycle 1000 //訓練週期為1000

#define train_step 0.3 //訓練步長

#define train_num 10 //訓練數字數量

#define table_len 9 //**長

#define table_wid 7 //**寬

#define max_lim 0.9 //輸出最大臨界值

#define min_lim 0.1 //輸出最小臨界值

#define input_num 63 //輸入層神經元數

#define hidden_num 30 //隱層神經元數

#define output_num 10 //輸出層神經元數

struct input_neurons input_n[input_num];

struct hidden_neurons hidden_n[hidden_num];

struct output_neurons output_n[output_num];

//訓練資料

bool traindata[train_num][table_len][table_wid] = ;

bool testdata[train_num][table_len][table_wid] = ;

//期望值

double y[train_num][output_num] = ;

//輸出存放陣列

double ans[output_num];

//sigmoid函式

double sigmoid(double x)

//sigmoid導函式

double sigmoid_der(double x)

//產生乙個[-1,1]的隨機數

double pro_decimal()

//初始化神經網路各節點權值

void init_w()

} for (int i = 0; i < hidden_num; i++)

} // cout << "test" << endl;

}//神經網路執行

void nn_run(bool(*nn_input)[table_wid])

for (int i = 0; i < output_num; i++)

//輸入資料

for (int i = 0; i < table_len; i++)

} //資料傳遞

for (int i = 0; i < hidden_num; i++)

} for (int i = 0; i < hidden_num; i++)

for (int i = 0; i < output_num; i++)

} for (int i = 0; i < output_num; i++)

}//返回是否訓練好

bool if_accomplish()

} }return true;

}void bp_study()

cout << endl;

}cout << "隱層與輸出層之間的權值" << endl;

for (int i = 0; i < hidden_num; i++)

cout << endl;

}return;

} for (int train_no = 0; train_no < train_num; train_no++)

//計算隱層誤差訊號(書p215-8.18b)

for (int i = 0; i < hidden_num; i++)

d_hidden[i] *= sigmoid_der(hidden_n[i].outp);

}//更新隱層和輸出層之間的權重(書p215-8.16b)

for (int i = 0; i < output_num; i++)

}//更新輸入層和隱層之間的權重(書p215-8.16b)

for (int i = 0; i < hidden_num; i++)

}} }

return;

}//神經網路輸出

void nn_print()

cout << endl;

} nn_run(testdata[x]);

double max = 0, maxi;

for (int i = 0; i < output_num; i++)

} cout << "輸入影象數字應該為" << maxi << endl << endl; }}

int main()

hopfield神經網路**

#include #include #include #include #include #include #include #include using namespace std;

#define maxl 100

#define maxn 100

int n, l, w[maxl][maxl], a[maxn][maxl], multi_result[maxl];

int get_w(int x, int y)

return w;

}void matrix_multi(int t[maxl])

multi_result[i] >= 0 ? multi_result[i] = 1 : multi_result[i] = 0;

} for (int i = 1; i <= l; i++)

cout << endl;

}int main()

} for (int i = 1; i < l; i++)

} for (int i = 2; i <= l; i++)

} cout << "連線權值為:" << endl;

for (int i = 1; i <= l; i++)

cout << endl;

} cout << "請輸入測試資料:" << endl;

int flag = 1;

while (flag)

cout << "開始迭代:" << endl;

matrix_multi(t);

while (memcmp(t, multi_result, l + 1))

cout << "達到穩定,穩定狀態為:" << endl;

for (int i = 1; i <= l; i++)

cout << endl;

cout << "結束輸入請輸入0,繼續輸入則輸入其他數字:";

cin >> flag;

}}

學習心得

了解了bp神經網路和離散hopfield神經網路的結構和原理,了解了反向傳播學習演算法對神經元的訓練過程,了解了反向傳播公式。通過構建了bp網路和離散hopfield網路模式識別的例項,知道了前饋網路和反饋網路的原理及結構,知道了模式識別的原理,知道了識別過程的程式設計方法。

模式識別 反向傳播神經網路 BPNN

回顧感知器學習演算法 其核心思想是梯度下降法,即以訓練樣本被錯分的程度為目標函式,訓練中每次出現錯誤時便使權係數朝著目標函式相對於權係數負梯度方向更新,知道目標中沒有被錯分的樣本為止。而多層感知器模型中,神經元傳遞函式是階躍函式,輸出端的無恥只能對最後乙個神經元係數求梯度,無法對其他權係數求梯度,所...

基於BP神經網路的數字識別

bp back propagation 表示反向傳播。bp網路能學習和存貯大量的輸入 輸出模式對映關係,而無需事前揭示描述這種對映關係的數學 方程。它的學習規則是使用最速下降法,通過反向傳播來不斷調整網路的權值和閾值,使網路的誤差平方和最小。bp神經網路模型拓撲結構包括輸入層 input 隱層 hi...

《模式識別》自學筆記 (二)基於統計的模式識別

解決模式識別問題的方法主要歸納為基於知識的方法和基於資料的方法兩大類。基於知識的方法,主要是以專家系統為代表的方法。其基本思想是根據人們已知的關於研究物件的知識,整理出若干描述特徵與類別間關係的準則,建立一定的計算機推理系統,對未知樣本通過這些知識推理決策類別。以專家系統為例,專家系統的組成部分包括...