1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| void ApprentissageRetropropagation(double poidsNeuroneC1[4], double poidsNeuroneCC[4], double poidsNeuroneCS[2] , int nombreEchantillonPos, int nombreEchantillonNeg)
{
int a(0), b(0), sortieImage(0);
double sortie(0),erreur(0),erreurCC[2],erreurC1[2];
bool TouteSortie = false;
int entre[4][3]={{0,0,0},{1,0,1},{0,1,1},{1,1,0}};
int echantillon[2];
int nombreEchantillonTot = nombreEchantillonPos + nombreEchantillonNeg;
double sortieC1[2], sortieCC[2];
while (TouteSortie!=1) {
a=0;
int h=0;
while (a<nombreEchantillonTot)
{
for (int j=0; j<2; j++)
echantillon[j]=entre[h][j];
sortieImage=entre[h][2];
//CALCUL DE LA SORTIE
for (int i=0; i<2; i++) {
sortieC1[i]=f(echantillon[0]*poidsNeuroneC1[i]+echantillon[1]*poidsNeuroneC1[i+2]);
}
for (int i=0; i<2; i++) {
//cout << "sorite C1 0 " <<sortieC1[0]*poidsNeuroneCC[i] << " sortie C1 1 "<< sortieC1[1]*poidsNeuroneCC[i+2];
sortieCC[i]=f(sortieC1[0]*poidsNeuroneCC[i]+sortieC1[1]*poidsNeuroneCC[i+2]);
}
sortie=f(sortieCC[0]*poidsNeuroneCS[0]+sortieCC[1]*poidsNeuroneCS[1]);
erreur=(sortieImage-sortie);//ERREUR SORTIE
if ((erreur)<0.1 && erreur>=0)
{
b++;
if (b>=nombreEchantillonTot)
{
TouteSortie=1;
}
}
else
{
double df=0;
b=0;
//petiit delta
for (int i=0; i<2; i++) {
erreurCC[i]=erreur*poidsNeuroneCS[i];
}
erreurC1[0]=poidsNeuroneCC[0]*erreurCC[0]+poidsNeuroneCC[1]*erreurCC[1];
erreurC1[1]=poidsNeuroneCC[2]*erreurCC[0]+poidsNeuroneCC[3]*erreurCC[1];
for (int i=0; i<2; i++) {
df=fp(echantillon[0]*poidsNeuroneC1[i]+echantillon[1]*poidsNeuroneC1[2+i]);
poidsNeuroneC1[0] += mu*erreurC1[i]*echantillon[0]*df;
poidsNeuroneC1[i+2] += mu*erreurC1[i]*echantillon[1]*df;
}
for (int i=0; i<2; i++) {
df=fp(sortieC1[0]*poidsNeuroneCC[i]+sortieC1[1]*poidsNeuroneCC[i+2]);
poidsNeuroneCC[i]+= mu * erreurCC[i]*df*sortieC1[0];
poidsNeuroneCC[i+2]+= mu * erreurCC[i]*df*sortieC1[1];
}
df=fp(sortieCC[0]*poidsNeuroneCS[0]+sortieCC[1]*poidsNeuroneCS[1]);
for (int i=0; i<=2; i=i+2) {
poidsNeuroneCS[i] += mu*erreur*sortie*df;
}
}
a++;
h++;
}
}
} |
Partager