• 简单前馈神经网络的实现


    层次型神经网络中计算步骤:
    ( 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逻辑运算相同

  • 相关阅读:
    二叉排序树
    安全的终止线程的两种方法
    图的广度优先遍历(BFS)
    图的深度优先遍历(DFS)
    volatile的应用
    二叉树的遍历
    Java-反射
    Java--泛型
    单例模式
    剑指Offer--对称二叉树
  • 原文地址:https://www.cnblogs.com/liweikuan/p/14196693.html
Copyright © 2020-2023  润新知