简单前馈神经网络的实现

层次型神经网络中计算步骤:
( 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("请输入数据:
");
 95     /*数据的输入*/
 96     while (scanf("%lf", &e[number][j]) != EOF) {
 97         ++j;
 98         if (j >= INPUT) {/*下一个数据*/
 99             j = 0;
100             ++number;
101         }
102     }
103     printf("输入数据完成。
");
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
", 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
", z);
136     }
137 
138     return 0;
139 }

结果与EOR逻辑运算相同

原文地址:https://www.cnblogs.com/liweikuan/p/14196693.html