简单前馈神经网络的实现
层次型神经网络中计算步骤:
( 1 )初始化权重和阈值。
( 2 )读入输入数据。
( 3 )针对所有输入数据进行如下计算。
( 3-1 )使用输入值和权重Wh, 求出输给输出层的hi;
( 3-2 )使用hi 和权重Wo , 计算输出值Z。
1 // 简单层次型神经网络 2 //1个输出的网络 3 4 #define _CRT_SECURE_NO_WARNINGS 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <math.h> 8 9 10 11 #define INPUT 2 /*输入层的神经元数*/ 12 #define HIDDEN 2 /*中间层的神经元数*/ 13 #define MAXINPUT 50 /*数据的最大个数*/ 14 15 16 17 18 /*中间层权重的初始化 */ 19 void initwh(double wh[][INPUT + 1]) 20 { 21 22 /*给权重和阈值*/ 23 wh[0][0] = -2; 24 wh[0][1] = 3; 25 wh[0][2] = -1;//阈值 26 wh[1][0] = -2; 27 wh[1][1] = 1; 28 wh[1][2] = 0.5;//阈值 29 30 } 31 32 33 34 35 36 /*输出层权重的初始化 */ 37 void initwo(double wo[]) 38 { 39 /*给权重和阈值*/ 40 wo[0] = -60; 41 wo[1] = 94; 42 wo[2] = -1;//阈值 43 } 44 45 46 47 48 /* 传递函数 */ 49 double f(double u) 50 { 51 /*阶梯函数的计算*/ 52 if (u >= 0) return 1.0; 53 else return 0.0; 54 55 /*sigmoid函数的计算*/ 56 // return 1.0/(1.0+exp(-u)) ; 57 } 58 59 60 61 62 /* forward()函数 */ 63 double forward(double wh[][INPUT + 1], double wo[], double hi[], double data[]) 64 { 65 int i, j;/*循环的控制*/ 66 double u;/*加权和的计算*/ 67 double z;/*输出的计算*/ 68 69 /*hi的计算*/ 70 for (i = 0; i < HIDDEN; ++i) 71 { 72 u = 0;/*求取加权和*/ 73 for (j = 0; j < INPUT; ++j) 74 u += data[j] * wh[i][j]; 75 u -= wh[i][j];/*阈值的处理*/ 76 hi[i] = f(u); 77 } 78 79 /*输出z的计算*/ 80 z = 0; 81 for (i = 0; i < HIDDEN; ++i) 82 z += hi[i] * wo[i]; 83 z -= wo[i];/*阈值的处理*/ 84 return f(z); 85 } 86 87 88 89 90 int getdata(double e[][INPUT]) 91 { 92 int number = 0;/*数据集的个数*/ 93 int j = 0;/*循环的控制用*/ 94 printf("请输入数据:\n"); 95 /*数据的输入*/ 96 while (scanf("%lf", &e[number][j]) != EOF) { 97 ++j; 98 if (j >= INPUT) {/*下一个数据*/ 99 j = 0; 100 ++number; 101 } 102 } 103 printf("输入数据完成。\n"); 104 return number; 105 } 106 107 108 109 110 int main() 111 { 112 double wh[HIDDEN][INPUT + 1];/*中间层的权重和阈值*/ 113 double wo[HIDDEN + 1];/*输出层的权重和阈值*/ 114 double data[MAXINPUT][INPUT];/*数据集*/ 115 double hi[HIDDEN];/*中间层的输出*/ 116 double z;/*输出*/ 117 int i, j;/*循环的控制*/ 118 int number;/*数据个数*/ 119 120 /*权重的初始化*/ 121 initwh(wh);/*初始化中间层*/ 122 initwo(wo);/*初始化输出层*/ 123 124 /*读入输入数据*/ 125 number = getdata(data); 126 printf("数据的个数:%d\n", number); 127 128 129 for (i = 0; i < number; ++i) 130 { 131 printf("%d ", i); 132 for (j = 0; j < INPUT; ++j) 133 printf("%lf ", data[i][j]); 134 z = forward(wh, wo, hi, data[i]); 135 printf("%lf\n", z); 136 } 137 138 return 0; 139 }
结果与EOR逻辑运算相同