📄 xor_1.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 + -