⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xor_1.cpp

📁 neural network in C language
💻 CPP
字号:
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <alloc.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <dos.h>

#define EROARE_LIMITA 0.1
#define ESC 27
/*
  0----------\
	      w0
	       \
		2----w2------3
	       /
	      w1
  1----------/
*/

void main(void)
{
 float eta=1.0;   /** rata de invatare    **/
 float alfa=1.0;  /** rata moment    **/
 float eroareCrtToateExemplele;
 float eroareMaxToateExemplele;
 float w0,w1,w2;
 float out[3];//iesirile neuronilor 0..2
 float yCalculat, yDorit;//iesirea neuronului 3
 //sabloanele de antrenare:
 float exempluOut[4]={0.1,0.9,0.9,0.1};
 float exempluIn[4][2]={0.1,0.1,0.1,0.9,0.9,0.1,0.9,0.9};

 float delta2,delta3;//Erorile calculate de algoritmul
       //de backpropagation, in nodurile 2,3.
 float eroareCrtUnExemplu[4];
 int nrCrtEpoci;
 int converged;
 int ex;//numarul curent al sablonului (exemplului de antrenare)
 int c;
 clrscr();
 randomize();
 w0=(float)rand()/RAND_MAX- 0.5;//fara (float) imi da mereu -0.5
 w1=(float)rand()/RAND_MAX -0.5;
 w2=(float)rand()/RAND_MAX -0.5;

 converged=0;
 nrCrtEpoci=0;
 //Algoritmul de backpropagation:
 while(!converged){
  for(ex=0;ex<4;ex++){
  //propagare inainte:
   out[0]=exempluIn[ex][0];
   out[1]=exempluIn[ex][1];
   out[2]=1/(1+exp(-w0*out[0]-w1*out[1]));
   yDorit=exempluOut[ex];//in nodul 3
   yCalculat=1/(1+exp(-w2*out[2]) );
   eroareCrtUnExemplu[ex]=0.5*(yCalculat-yDorit)*(yCalculat-yDorit);
   //modifica ponderi:
   //(eta=alfa=1.0)
   //Eroarea calculata de algoritmul de backpropagation in nodul
   // de iesire, delta3:
   delta3=(yCalculat-yDorit)*(1-yCalculat)*yCalculat;
   //Ajustarea ponderilor conexiunilor la nodul 3:
   w2=alfa*w2-eta*out[2]*delta3;
   //Pentru neuronul (nodul) 2:
   delta2=w2*delta3*(1-out[2])*out[2];
   //Atentie: (1-out[i])*out[i] este derivata funciei sigmoide
   //         f(x)=1/(1+exp(-x)) in raport cu intrarea globala x
   //Ajustarea ponderilor conexiunilor conectate la nodul 2:
   w0=alfa*w0-eta*out[0]*delta2;
   w1=alfa*w1-eta*out[0]*delta2;
  }//for
  nrCrtEpoci++;
  eroareCrtToateExemplele=0;
  for(ex=0;ex<4;ex++)
   eroareCrtToateExemplele+=eroareCrtUnExemplu[ex];
  printf("\nEpoca %d:  Eroare totala pt. 4 exemple =%f",
	   nrCrtEpoci,eroareCrtToateExemplele);
  if(eroareCrtToateExemplele<=EROARE_LIMITA)converged=1;
 }//while
 //afisare ponderi gasite:
 printf("\nw0=%f",w0);
 printf("\nw1=%f",w1);
 printf("\nw2=%f",w2);
 getch();
}//main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -