?? main.cpp
字號:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
/******************************************************************************
宏定義
******************************************************************************/
typedef int BOOL;
typedef int INT;
typedef double REAL;
typedef char CHAR;
#define FALSE 0
#define TRUE 1
#define NOT !
#define AND &&
#define OR ||
#define MIN(x,y) ((x)<(y) ? (x) : (y))
#define MAX(x,y) ((x)>(y) ? (x) : (y))
#define sqr(x) ((x)*(x))
#define LO 0.1
#define HI 0.9
#define BIAS 0.5
#define NUM_LAYERS 3 //網絡層數
#define NUM_DATA 10 //樣本數
#define X 6 //每個樣本的列數
#define Y 7 //每個樣本的行數
#define N (X * Y) //輸入層神經元個數
#define M 10 //輸出層神經元個數
/////////////////////////////////////////////////////////////////////////////////////////
// 結構變量聲明 //
/////////////////////////////////////////////////////////////////////////////////////////
typedef struct {
INT Units; //層神經元數量
REAL* Output; //輸出數 (即輸出個矢量元素個數)
REAL* Activation; //激活值
REAL* Error; //本層誤差
REAL** Weight; //連接權
REAL** WeightSave; //保存訓練調整后的連接權
REAL** dWeight; //調整量
} LAYER; //神經網絡層結構
typedef struct {
LAYER** Layer; //神經網絡各層指針
LAYER* InputLayer; //輸入層
LAYER* OutputLayer; //輸出層
REAL Alpha; //沖量參數
REAL Eta; //學習率
REAL Error; //總誤差
REAL Epsilon; //控制精度
} NET; // 神經網絡
INT Units[NUM_LAYERS] = {N, 10, M}; //用一維數組記錄各層神經元個數
FILE* f;//聲明文件指針
REAL Input[NUM_DATA][N];//用來記錄學習樣本輸入模式
REAL Inputtest[NUM_DATA][N];//用來記錄測試樣本輸入模式
/******************************************************************************
各函數聲明
******************************************************************************/
void InitializeRandoms(); //設置偽隨機數種子
INT RandomEqualINT(INT Low, INT High);//產生一個LOW - TOP之間的偽隨機整數
REAL RandomEqualREAL(REAL Low, REAL High);//產生一個LOW - TOP之間的偽隨機浮點數
void FinalizeApplication(NET* Net);//關閉文件
void RandomWeights(NET* Net) ;//隨機生成網絡各層聯接權
void SaveWeights(NET* Net);//保存網絡各層聯接權,以防丟失寶貴的聯接權
void RestoreWeights(NET* Net);//恢復網絡各層聯接權,以便重建網絡
void GenerateNetwork(NET* Net);//創建網絡,為網絡分配空間
void InitializeApplication(NET* Net);//將學習樣本轉換成為輸入模式,并創建一個文件以保存顯示結果
void SimulateNet(NET* Net, REAL* Input, REAL* Target, BOOL Training,BOOL Protocoling);//將每個樣本投入網絡運作
void SetInput(NET* Net, REAL* Input,BOOL Protocoling);// 獲得輸入層的輸出
void PropagateLayer(NET* Net, LAYER* Lower, LAYER* Upper);//計算當前層的網絡輸出,upper 為當前層,LOWER為前一層
void PropagateNet(NET* Net);//計算整個網絡各層的輸出
void GetOutput(NET* Net, REAL* Output,BOOL Protocoling);//獲得輸出層的輸出
void ComputeOutputError(NET* Net, REAL* Target);//計算網絡輸出層的輸出誤差
void BackpropagateLayer(NET* Net, LAYER* Upper, LAYER* Lower);//當前層誤差反向傳播
void BackpropagateNet(NET* Net);////整個網絡誤差的后傳
void AdjustWeights(NET* Net); //調整網絡各層聯接權,提取樣本特征
void WriteInput(NET* Net, REAL* Input);//顯示輸入模式
void WriteOutput(NET* Net, REAL* Output);//顯示輸出模式
void Initializetest();//將測試樣本轉換成為輸入模式
/******************************************************************************
學習樣本
******************************************************************************/
CHAR Pattern[NUM_DATA][Y][X]={ {" OOO ",
"O O",
"O O",
"O O",
"O O",
"O O",
" OOO " },
{ " O ",
" OO ",
"O O ",
" O ",
" O ",
" O ",
" O " },
{ " OOO ",
"O O",
" O",
" O ",
" O ",
" O ",
"OOOOO" },
{ " OOO ",
"O O",
" O",
" OOO ",
" O",
"O O",
" OOO " },
{ " O ",
" OO ",
" O O ",
"O O ",
"OOOOO",
" O ",
" O " },
{ "OOOOO",
"O ",
"O ",
"OOOO ",
" O",
"O O",
" OOO " },
{ " OOO ",
"O O",
"O ",
"OOOO ",
"O O",
"O O",
" OOO " },
{ "OOOOO",
" O",
" O",
" O ",
" O ",
" O ",
"O " },
{ " OOO ",
"O O",
"O O",
" OOO ",
"O O",
"O O",
" OOO " },
{ " OOO ",
"O O",
"O O",
" OOOO",
" O",
"O O",
" OOO " } };
/******************************************************************************
測試樣本
******************************************************************************/
CHAR testPattern[NUM_DATA][Y][X] = { {" OO ",
"O O",
" O",
"O O",
" ",
"O O",
" OOO " },
{ " O O",
" O O",
" O ",
" ",
" O ",
" O ",
" O " },
{ " OOO ",
"O O",
"O O",
" ",
" O ",
" O ",
"OOOOO" },
{ " OOO ",
"O O",
" O",
"O OO ",
" O",
"O ",
" OOO " },
{ " O ",
" OO ",
" O O ",
"O O ",
" OO ",
" O ",
" O " },
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -