?? main.cpp
字號:
{ "OOOOO",
"O ",
"O ",
"O ",
" O",
"O O",
" OOO " },
{ " OOO ",
" O",
"O ",
"OOOO ",
"O O",
" O",
" O O " },
{ "O O O",
" O",
" O",
" O ",
" O ",
" O ",
"O " },
{ " OOO ",
" O",
"O O",
" OOO ",
"O O",
"O ",
" OOO " },
{ "O O ",
" O",
"O O",
" OOO",
" ",
" O",
"O OO " } };
/******************************************************************************
//導師信號,按從上到下的順序分別表示0~9
******************************************************************************/
REAL Target[NUM_DATA][M] =
{ {HI, LO, LO, LO, LO, LO, LO, LO, LO, LO},
{LO, HI, LO, LO, LO, LO, LO, LO, LO, LO},
{LO, LO, HI, LO, LO, LO, LO, LO, LO, LO},
{LO, LO, LO, HI, LO, LO, LO, LO, LO, LO},
{LO, LO, LO, LO, HI, LO, LO, LO, LO, LO},
{LO, LO, LO, LO, LO, HI, LO, LO, LO, LO},
{LO, LO, LO, LO, LO, LO, HI, LO, LO, LO},
{LO, LO, LO, LO, LO, LO, LO, HI, LO, LO},
{LO, LO, LO, LO, LO, LO, LO, LO, HI, LO},
{LO, LO, LO, LO, LO, LO, LO, LO, LO, HI} };
/******************************************************************************
主程序
******************************************************************************/
void main()
{
INT m,n,count;//循環變量
NET Net;//網絡變量聲明
BOOL Stop;//學習是否結束的控制變量
REAL Error;//記錄當前所有樣本的最大誤差
InitializeRandoms();//生成隨機數
GenerateNetwork(&Net);//創建網絡并初始化網絡,分配空間
RandomWeights(&Net);//初始化網絡聯接權
InitializeApplication(&Net);//初始化輸入層,將學習樣本轉換成輸入模式
count=0;//顯示學習進度的控制變量
do {
Error = 0;//誤差
Stop = TRUE;//初始化
for (n=0; n<NUM_DATA; n++) { //對每個模式計算模擬神經網絡誤差
SimulateNet(&Net, Input[n],Target[n], FALSE, FALSE); //計算模擬神經網絡誤差
Error = MAX(Error, Net.Error);//巧妙的做法,獲取結構的值,獲取誤差最大值
Stop = Stop AND (Net.Error < Net.Epsilon);
count++;
}
Error = MAX(Error, Net.Epsilon);//作用:防止溢出,保證到100%的時候停止訓練,獲取誤差最大值
if (count%300==0){
printf("Training %0.0f%% completed \n", (Net.Epsilon / Error) * 100);
}//只能做一個參考,并非單調上升的值
if (NOT Stop) {
for (m=0; m<10*NUM_DATA; m++) { //對各模式進行訓練
n = RandomEqualINT(0,NUM_DATA-1); //隨機選擇訓練模式
SimulateNet(&Net, Input[n],Target[n], TRUE,FALSE );
}
}
} while (NOT Stop);
printf("BP神經網絡學習結束!\n 請按一鍵繼續工作:讀入測試數據進行識別!\n");
getch();
SaveWeights(&Net);//學習結束后保存寶貴的聯接權
//網絡開始工作
Initializetest();//初始化測試樣本,將其轉化成輸入模式
for (n=0; n<NUM_DATA; n++) {
SimulateNet(&Net, Inputtest[n],Target[n], FALSE, TRUE);
}
FinalizeApplication(&Net);//關閉文件
printf("BP神經網絡完成了識別任務!\n請在result.txt文件中檢查識別結果。\n");
printf("請按任意鍵以結束程序!\n");
//getch();
getch();
}
/******************************************************************************
產生隨機數
******************************************************************************/
//設置偽隨機數種子
void InitializeRandoms()
{
srand(4711);
}
//產生一個LOW - TOP之間的偽隨機整數
INT RandomEqualINT(INT Low, INT High)
{
return rand() % (High-Low+1) + Low;
}
//產生一個LOW - TOP之間的偽隨機浮點數
REAL RandomEqualREAL(REAL Low, REAL High)
{
return ((REAL) rand() / RAND_MAX) * (High-Low) + Low;
}
/******************************************************************************
//關閉文件
******************************************************************************/
void FinalizeApplication(NET* Net)
{
fclose(f);
}
/******************************************************************************
//隨機生成聯接權
******************************************************************************/
void RandomWeights(NET* Net)
{
INT l,i,j;
for (l=1; l<NUM_LAYERS; l++) { //每層
for (i=1; i<=Net->Layer[l]->Units; i++) {
for (j=0; j<=Net->Layer[l-1]->Units; j++) {
Net->Layer[l]->Weight[i][j] = RandomEqualREAL(-0.5, 0.5);//隨機值
}
}
}
}
/******************************************************************************
//保存連接權,防止丟失寶貴的聯接權
******************************************************************************/
void SaveWeights(NET* Net)
{
INT l,i,j;
for (l=1; l<NUM_LAYERS; l++) {
for (i=1; i<=Net->Layer[l]->Units; i++) {
for (j=0; j<=Net->Layer[l-1]->Units; j++) {
Net->Layer[l]->WeightSave[i][j] = Net->Layer[l]->Weight[i][j];
}
}
}
}
/******************************************************************************
//恢復連接權,以便需要的時候可以重新調用,重組網絡
******************************************************************************/
void RestoreWeights(NET* Net)
{
INT l,i,j;
for (l=1; l<NUM_LAYERS; l++) {
for (i=1; i<=Net->Layer[l]->Units; i++) {
for (j=0; j<=Net->Layer[l-1]->Units; j++) {
Net->Layer[l]->Weight[i][j] = Net->Layer[l]->WeightSave[i][j];
}
}
}
}
/******************************************************************************
//創建網絡,為網絡分配空間
******************************************************************************/
void GenerateNetwork(NET* Net)
{
INT l,i;
Net->Layer = (LAYER**) calloc(NUM_LAYERS, sizeof(LAYER*));
for (l=0; l<NUM_LAYERS; l++) {
Net->Layer[l] = (LAYER*) malloc(sizeof(LAYER));
Net->Layer[l]->Units = Units[l];
Net->Layer[l]->Output = (REAL*) calloc(Units[l]+1, sizeof(REAL));
Net->Layer[l]->Activation = (REAL*) calloc(Units[l]+1, sizeof(REAL));
Net->Layer[l]->Error = (REAL*) calloc(Units[l]+1, sizeof(REAL));
Net->Layer[l]->Weight = (REAL**) calloc(Units[l]+1, sizeof(REAL*));
Net->Layer[l]->WeightSave = (REAL**) calloc(Units[l]+1, sizeof(REAL*));
Net->Layer[l]->dWeight = (REAL**) calloc(Units[l]+1, sizeof(REAL*));
Net->Layer[l]->Output[0] = BIAS;
if (l != 0) {
for (i=1; i<=Units[l]; i++) {
Net->Layer[l]->Weight[i] = (REAL*) calloc(Units[l-1]+1, sizeof(REAL));
Net->Layer[l]->WeightSave[i] = (REAL*) calloc(Units[l-1]+1, sizeof(REAL));
Net->Layer[l]->dWeight[i] = (REAL*) calloc(Units[l-1]+1, sizeof(REAL));
}
}
}
Net->InputLayer = Net->Layer[0];//為輸入層分配指針
Net->OutputLayer = Net->Layer[NUM_LAYERS-1];//為輸出層分配指針
Net->Alpha = 0.8;//沖量參數
Net->Eta = 0.5;//學習率
Net->Epsilon =0.005;//控制精度
}
/******************************************************************************
將輸入樣本轉換成為輸入模式,并創建一個文件以保存顯示結果
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -