神经网络的C语言实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

#include

#define OUT_COUT 2 //输出向量维数

#define IN_COUT 3 //输入向量维数

#define COUT 6 //样本数量

typedef struct { //bp人工神经网络结构

int h; //实际使用隐层数量

double v[IN_COUT][50]; //隐藏层权矩阵i,隐层节点最大数量为50 double w[50][OUT_COUT]; //输出层权矩阵

double a; //学习率

double b; //精度控制参数

int LoopCout; //最大循环次数

} bp_nn;

double fnet(double net) { //Sigmoid函数,神经网络激活函数return 1/(1+exp(-net));

}

int InitBp(bp_nn *bp) { //初始化bp网络

printf("请输入隐层节点数,最大数为100:\n");

scanf("%d", &(*bp).h);

printf("请输入学习率:\n");

scanf("%lf", &(*bp).a); //(*bp).a为double型数据,所以必须是lf

printf("请输入精度控制参数:\n");

scanf("%lf", &(*bp).b);

printf("请输入最大循环次数:\n");

scanf("%d", &(*bp).LoopCout);

int i, j;

srand((unsigned)time(NULL));

for (i = 0; i < IN_COUT; i++)

for (j = 0; j < (*bp).h; j++)

(*bp).v[i][j] = rand() / (double)(RAND_MAX);

for (i = 0; i < (*bp).h; i++)

for (j = 0; j < OUT_COUT; j++)

(*bp).w[i][j] = rand() / (double)(RAND_MAX);

return 1;

}

int TrainBp(bp_nn *bp, float x[COUT][IN_COUT], int y[COUT][OUT_COUT]) { //训练bp网络,样本为x,理想输出为y

double f = (*bp).b; //精度控制参数

double a = (*bp).a; //学习率

int h = (*bp).h; //隐层节点数

double v[IN_COUT][50], w[50][OUT_COUT]; //权矩阵

double ChgH[50], ChgO[OUT_COUT]; //修改量矩阵

double O1[50], O2[OUT_COUT]; //隐层和输出层输出量

int LoopCout = (*bp).LoopCout; //最大循环次数

int i, j, k, n;

double temp;

for (i = 0; i < IN_COUT; i++) // 复制结构体中的权矩阵for (j = 0; j < h; j++)

v[i][j] = (*bp).v[i][j];

for (i = 0; i < h; i++)

for (j = 0; j < OUT_COUT; j++)

w[i][j] = (*bp).w[i][j];

double e = f + 1;

for (n = 0; e > f && n < LoopCout; n++) { //对每个样本训练网络

e = 0;

for (i= 0; i < COUT; i++) {

for (k= 0; k < h; k++) { //计算隐层输出向量

temp = 0;

for (j = 0; j < IN_COUT; j++)

temp = temp + x[i][j] * v[j][k];

O1[k] = fnet(temp);

}

for (k = 0; k < OUT_COUT; k++) { //计算输出层输出向量temp = 0;

for (j = 0; j < h; j++)

temp = temp + O1[j] * w[j][k];

O2[k] = fnet(temp);

}

for (j = 0; j < OUT_COUT; j++) //计算输出层的权修改量ChgO[j] = O2[j] * (1 - O2[j]) * (y[i][j] - O2[j]);

for (j = 0; j < OUT_COUT ; j++) //计算输出误差

e = e + (y[i][j] - O2[j]) * (y[i][j] - O2[j]);

for (j = 0; j < h; j++) { //计算隐层权修改量

temp = 0;

for (k = 0; k < OUT_COUT; k++)

temp = temp + w[j][k] * ChgO[k];

ChgH[j] = temp * O1[j] * (1 - O1[j]);

}

for (j = 0; j < h; j++) //修改输出层权矩阵for (k = 0; k < OUT_COUT; k++)

w[j][k] = w[j][k] + a * O1[j] * ChgO[k];

for (j = 0; j < IN_COUT; j++)

for (k = 0; k < h; k++)

v[j][k] = v[j][k] + a * x[i][j] * ChgH[k];

}

if (n % 10 == 0)

printf("误差: %f\n", e);

}

printf("总共循环次数:%d\n", n);

printf("调整后的隐层权矩阵:\n");

for (i = 0; i < IN_COUT; i++) {

for (j = 0; j < h; j++)

printf("%f ", v[i][j]);

printf("\n");

}

printf("调整后的输出层权矩阵:\n");

for (i = 0; i < h; i++) {

for (j = 0; j < OUT_COUT; j++)

printf("%f ", w[i][j]);

printf("\n");

}

for (i = 0; i < IN_COUT; i++) //把结果复制回结构体for (j = 0; j < h; j++)

(*bp).v[i][j] = v[i][j];

for (i = 0; i < h; i++)

相关文档
最新文档