pistes pour traduction code écrit en C en python

pistes pour traduction code écrit en C en python - C - Programmation

Marsh Posté le 10-03-2016 à 16:08:31    

Bonjour,
 
Je dois écrire un programme en python pour faire un résau MLP (multilayer perceptron) en m'inspirant d'un code écrit en c le probleme est que je n'ai aucune connaissance en C  
 
auriez-vous des pistes à me donner pour sa traduction (les trucs du genre correspondance de typedef en python ou encore de double , void ...)

Code :
  1. //inclusion des bibliotheques d'utilitaires
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <time.h>
  6. ////////////////////////////////////////////////////////////////////////////////
  7. //debut des structures de donnees
  8. #define coef 2.0   //pente de la fonction sigmoide en zero
  9. #define coed 1.0   //demi-pente (pour l'oprerateur derive)
  10. // sera lue dans le fichier #define diment 26  //dimension de l'espace d'entree
  11. #define dimsor 1   //dimension de l'espace de sortie
  12. #define maxcar 50  //nombre maximum de caracteres pour les noms des fichiers
  13. typedef struct // -- structure d'un neurone --
  14. {
  15.     int nbent;  //nombre d'entrees du neurone
  16.     double *x;  //tableau des entrees X
  17.     double *w;  //tableau des poids W
  18.     double a;   //activation (somme ponderee des entrees = somme(WiXi))
  19.     double s;   //sortie (fonction sigmoide de l'activation =f(a))
  20.     double y;   //gradient
  21. }strucNeurone;
  22. typedef struct // -- structure d'une couche --
  23. {
  24.     int nbneu;      //nombre de neurones
  25.     strucNeurone *neurone;  //tableau de neurones
  26. }strucCouche;
  27. typedef struct // -- structure d'un reseau --
  28. {
  29.   int nbcou;        //nombre de couches
  30.   strucCouche *couche;  //tableau de couches
  31. }strucReseau;
  32. typedef struct // -- base d'exemples --
  33. {
  34.   int nbex;     //nombre d'exemples
  35.   double **xx;  //vecteurs des entrees
  36.   double **sd;  //vecteurs des sorties desirees
  37. }strucBase;
  38. strucReseau res;  //le reseau MLP
  39. char nficapp[maxcar]; //nom du fichier d'apprentissage
  40. char nficgen[maxcar]; //nom du fichier de generalisation
  41. strucBase app,gen;    //les bases d'apprentissage et de generalisation
  42. char nresult[maxcar]; //nom du fichier de stockage des resultats
  43. FILE *ficresu;        //fichier dans lequel on stockera les parametres et les resultats
  44. float alpha;  //coefficient d'apprentissage (pas de gradient)
  45. int nbpass;   //nombre de passes de la base d'exemples
  46. int diment;   //dimension d'entree
  47. //fin des structures de donnees
  48. /////////////////////////////////////////////////////////////////
  49. //fonctions mathematiques ///////////////////
  50. double sigmo(double a)    //fonction sigmoide -- s'applique a l'activation a
  51. {
  52.     double aux;
  53.     aux=exp(coef*a);
  54.     return((aux-1)/(aux+1));  //fonction impaire, a valeurs dans ]-1;+1[
  55. }
  56. double deriv(double fa)   //operateur derive -- s'applique a la sortie s=f(a)
  57. {
  58.   return(coed*(1+fa)*(1-fa));  //formule pour calculer f'(a) a partir de f(a)
  59. }
  60. //procedures d'initialisation ///////////////////
  61. void initNeurone(int i, int k)
  62. {
  63.   int j;
  64.   // printf("initialisation du neurone %d de la couche %d\n",i+1,k);
  65.   res.couche[k].neurone[i].nbent=res.couche[k-1].nbneu;
  66.   res.couche[k].neurone[i].x=(double*)malloc(sizeof(double)*res.couche[k].neurone[i].nbent);
  67.   res.couche[k].neurone[i].w=(double*)malloc(sizeof(double)*res.couche[k].neurone[i].nbent);;
  68.   for (j=0;j<res.couche[k].neurone[i].nbent;j++)
  69.     { res.couche[k].neurone[i].w[j]=0.6*rand()/RAND_MAX-0.3;  //poids initiaux dans [-0.3;+0.3]
  70.      // printf("w[%d,%d,%d]=%lf\t",i,j,k,res.couche[k].neurone[i].w[j]);
  71.     }
  72. }
  73. void initCouche(int k)
  74. {
  75.   int i;
  76.   printf("initialisation de la couche %d\n",k);
  77.   if (k==0)                 // couche d'entree
  78.     res.couche[k].nbneu=diment;
  79.   else if (k==res.nbcou-1)  // couche de sortie
  80.     res.couche[k].nbneu=dimsor;
  81.   else                      // couches cachees
  82.     { printf("\nNombre de neurones sur la couche cachee %d : ",k);
  83.       scanf("\n%d",&res.couche[k].nbneu);
  84.       fprintf(ficresu,"Nombre de neurones sur la couche cachee %d : %d\n",k,res.couche[k].nbneu);
  85.     }
  86.   res.couche[k].neurone=(strucNeurone*)malloc(sizeof(strucNeurone)*res.couche[k].nbneu);
  87.   if (k>0)
  88.     for (i=0;i<res.couche[k].nbneu;i++)  //initialisation de chaque neurone i de la couche k
  89.       { // printf("\n -- appel initNeurone avec i=%d et k=%d\n",i,k);
  90.         initNeurone(i,k);
  91.       }
  92. }
  93. void initReseau()
  94. {
  95.   int k,nbcach;
  96.   printf("initialisation du reseau MLP\n" );
  97.   printf("\nNombre de couches cachees : " );
  98.   scanf("\n%d",&nbcach);
  99.   res.nbcou=nbcach+2;
  100.   fprintf(ficresu,"Nombre de couches cachees : %d\n",nbcach);
  101.   res.couche=(strucCouche*)malloc(sizeof(strucCouche)*(nbcach+2));
  102.   for (k=0;k<res.nbcou;k++)
  103.     { printf("\n -- appel initCouche avec k=%d\n",k); initCouche(k);}
  104. }
  105. void initBase(char *nomfich, strucBase *base)
  106. {
  107.   int i,j;
  108.   char c;
  109.   FILE *fich;
  110.   printf("Lecture des motifs, a partir du fichier %s\n",nomfich);
  111.   fich=fopen(nomfich,"r" );
  112.   fscanf(fich,"%d",&(base->nbex));     //le nombre d'exemples est en 1ere ligne du fichier
  113.   printf("nbex = %d \n",base->nbex);
  114.   fscanf(fich,"%d",&diment);   //la dim. des entrees est en 2eme ligne du fichier
  115.   printf("diment = %d \n",diment);
  116.   base->xx=(double**)malloc(sizeof(double)*base->nbex);
  117.   base->sd=(double**)malloc(sizeof(double)*base->nbex);
  118.   for (i=0;i<base->nbex;i++)         //on lit, l'un apres l'autre, tous les exemples de la base
  119.     { base->xx[i]=(double*)malloc(sizeof(double)*diment); //le vecteur des entrees, suivi de...
  120.       for (j=0;j<diment;j++)
  121.     fscanf(fich,"%lf",&(base->xx[i][j]));
  122.       base->sd[i]=(double*)malloc(sizeof(double)*dimsor); //...le vecteur des sorties desirees
  123.       for (j=0;j<dimsor;j++)
  124.     fscanf(fich,"%lf",&(base->sd[i][j]));
  125.     }
  126.   fclose(fich);
  127.   printf("fin de la lecture des motifs\n" );
  128. }
  129. //procedures de presentation d'un exemple au reseau ///////////////////
  130. void prezEntrees(int numex, strucBase base)  //presentation d'un exemple au reseau
  131. {
  132.   int i;
  133. //les composantes de l'exemple numex sont les sorties des neurones de la couche 0 du reseau
  134.   for (i=0;i<diment;i++)
  135.       res.couche[0].neurone[i].s=base.xx[numex][i];
  136. }
  137. //procedures de fonctionnement du reseau ///////////////////
  138. void aller()  //passe avant : calcul de la sortie du reseau, pour l'exemple presente
  139. {
  140.   int i,j,k;
  141.   for (k=1;k<res.nbcou;k++)
  142.     for (i=0;i<res.couche[k].nbneu;i++)
  143.       { res.couche[k].neurone[i].a=0.0;
  144.     for (j=0;j<res.couche[k].neurone[i].nbent;j++)
  145.       { res.couche[k].neurone[i].x[j]=res.couche[k-1].neurone[j].s;
  146.         res.couche[k].neurone[i].a+=res.couche[k].neurone[i].w[j]*res.couche[k].neurone[i].x[j];
  147.       }
  148.     res.couche[k].neurone[i].s=sigmo(res.couche[k].neurone[i].a);
  149.       }
  150. }
  151. void gradsor(int numex)  //calcul des gradients d'erreur, sur la couche de sortie
  152. {
  153.   int i;
  154.   double dsig;  //derivee de la sigmoide
  155.   for (i=0;i<dimsor;i++)
  156.     { dsig=deriv(res.couche[res.nbcou-1].neurone[i].s);
  157.       res.couche[res.nbcou-1].neurone[i].y=2*dsig*(app.sd[numex][i]-res.couche[res.nbcou-1].neurone[i].s);
  158.     }
  159. }
  160. void retour()  //passe arriere : calcul des gradients retropropages, dans les couches cachees
  161. {
  162.   int i,m,k;
  163.   double dsig;
  164.   double somm;
  165.   for (k=res.nbcou-2;k>0;k--)
  166.     for (i=0;i<res.couche[k].nbneu;i++)
  167.       { dsig=deriv(res.couche[k].neurone[i].s);
  168.     somm=0.0;
  169.     for(m=0;m<res.couche[k+1].nbneu;m++)
  170.       somm+=res.couche[k+1].neurone[m].w[i]*res.couche[k+1].neurone[m].y;
  171.     res.couche[k].neurone[i].y=dsig*somm;
  172.       }
  173. }
  174. void modifw()  //mise a jour des poids du reseau (toutes les couches)
  175. {
  176.   int i,j,k;
  177.   for (k=1;k<res.nbcou;k++)
  178.     for (i=0;i<res.couche[k].nbneu;i++)
  179.       for (j=0;j<res.couche[k].neurone[i].nbent;j++)
  180.     res.couche[k].neurone[i].w[j]+=alpha*res.couche[k].neurone[i].y*res.couche[k].neurone[i].x[j];
  181. }
  182. //fonctions d'evaluation des perfromances ///////////////////
  183. int tstsor(int numex, strucBase base)  //resultat booleen -- version actuelle : pour dimsor=1
  184. {
  185. //test actuel implemente pour le seul cas ou il n'y a qu'une seule sortie, valant -1 ou +1
  186.     if (res.couche[res.nbcou-1].neurone[0].s*base.sd[numex][0]>0)
  187.       return(1);
  188.     else
  189.       return(0);
  190. }
  191. double tauxSucces(strucBase base)
  192. {
  193.   int i,nbsuc;
  194.   nbsuc=0;
  195.   for(i=0;i<base.nbex;i++)
  196.     { prezEntrees(i,base);
  197.       aller();
  198.       if (tstsor(i,base)==1)
  199.     nbsuc++;
  200.     }
  201.   return((double) nbsuc/base.nbex);
  202. }
  203. //procedure de controle des processus d'apprentissage et de generalisation ///////////////////
  204. void melange(int n) //optionnel : change l'ordre de presentation des exemples
  205. {
  206. //non implemente actuellement
  207. }
  208. void appren(int nbpass) //apprentissage sur nbpass passes de la base d'exemples
  209. {
  210. //non implemente actuellement
  211. }
  212. void general()  //teste le reseau sur la base de generalisation
  213. {
  214. //non implemente actuellement
  215. }
  216. void appgen(int nbpass) //apprentissage avec test en generalisation a chaque passe
  217. {
  218.   int p,i;
  219.   double taux;
  220.   for (p=0;p<nbpass;p++)
  221.     { printf("Passe n. %d\t",p+1);
  222.       fprintf(ficresu,"Passe n. %d\t",p+1);
  223.       for (i=0;i<app.nbex;i++) //une passe d'apprentissage sur toute la base d'exemples
  224.     { prezEntrees(i,app);
  225.       aller();
  226.       gradsor(i);
  227.       retour();
  228.       modifw();
  229.     }
  230.       taux=tauxSucces(app); //evaluation du taux de succes en apprentissage
  231.       printf("taux app : %lf\t",taux);
  232.       fprintf(ficresu,"taux app : %lf\t",taux);
  233.       taux=tauxSucces(gen); //evaluation du taux de succes en generalisation
  234.       printf("taux gen : %lf\n",taux);
  235.       fprintf(ficresu,"taux gen : %lf\n",taux);
  236.     }
  237. }
  238. /////////////////////////////////////////////////////////////////
  239. //programme principal ///////////////////
  240. void main()
  241. {
  242.   srand(1234);
  243.   double tt1,tt2;
  244.   printf("\nNom du fichier d'apprentissage : " );
  245.   scanf("\n%s",nficapp);
  246.   //strcpy(nficapp,"testOdeur/odeur8.app" );
  247.   printf("Nom du fichier de generalisation : " );
  248.   scanf("\n%s",nficgen);
  249.   //strcpy(nficgen,"testOdeur/odeur8.gen" );
  250.   printf("\nNom du fichier de resultats : " );
  251.   scanf("\n%s",nresult);
  252.   //strcpy(nresult,"toto" );
  253.   ficresu=fopen(nresult,"w" );
  254.   fprintf(ficresu,"Apprentissage sur %s\t",nficapp);
  255.   printf("\n -- appel initBase, pour les donnees d'apprentissage\n" );
  256.   initBase(nficapp,&app);
  257.   fprintf(ficresu,"  [ %d exemples ]\n",app.nbex);
  258.   fprintf(ficresu,"Generalisation sur %s\t",nficgen);
  259.   printf("\n -- appel initBase, pour les donnees de generalisation\n" );
  260.   initBase(nficgen,&gen);
  261.   fprintf(ficresu,"  [ %d exemples ]\n",gen.nbex);
  262.   printf("\nValeur du pas de gradient : " );
  263.   scanf("%f",&alpha);
  264.   fprintf(ficresu,"alpha=%f\t",alpha);
  265.   printf("Nombre de passes de la base d'exemples : " );
  266.   scanf("%d",&nbpass);
  267.   fprintf(ficresu,"nbpass=%d\n",nbpass);
  268.   fprintf(ficresu,"Taille de la couche d'entree = %d\n",diment);
  269.   fprintf(ficresu,"Taille de la couche de sortie = %d\n",dimsor);
  270.   printf("\n -- appel initReseau\n" );
  271.   initReseau();
  272.   printf("\n\nPhase d'apprentissage, avec test en apprentissage et en generalisation, apres chaque passe de la base d'exemples.\n\n" );
  273. tt1=clock();
  274.   appgen(nbpass);
  275. tt2=clock(); printf("temps--->%f s\n",(tt2-tt1)*0.000001);
  276.   fprintf(ficresu,"\ntemps--->%f s\n",(tt2-tt1)*0.000001);
  277.   fclose(ficresu);
  278. }
  279. //fin du programme
  280. /////////////////////////////////////////////////////////////////


Merci pour toutes les pistes ou traductions que vous pourriez me proposer =)
la partie sur les fichiers je pense savoir comment faire c'est le reste :
 
comment traduire le void (faire une fonction avec def fonction() ? )
 
idem pour typedef struct
 
et

Code :
  1. res.couche[k].neurone[i].nbent=res.couche[k-1].nbneu;
  2. res.couche[k].neurone[i].x=(double*)malloc(sizeof(double)*res.couche[k].neurone[i].nbent);
  3. res.couche[k].neurone[i].w=(double*)malloc(sizeof(double)*res.couche[k].neurone[i].nbent);;
  4. for (j=0;j<res.couche[k].neurone[i].nbent;j++)
  5.    { res.couche[k].neurone[i].w[j]=0.6*rand()/RAND_MAX-0.3;


 
 :)

Reply

Marsh Posté le 10-03-2016 à 16:08:31   

Reply

Marsh Posté le 10-03-2016 à 17:05:42    

voila ce que j'ai fait :

Code :
  1. import math
  2. import time
  3. ####################################################################
  4. ### debut structures de donnees######################################
  5. coef = 2.0
  6. coed = 1.0
  7. dimsor = 1
  8. maxcar = 50
  9. ##structure d'un neurone
  10. ## structure d'une couche
  11. ## structure d'un reseau
  12. ## base d'exemples
  13. ## le reseau MLP
  14. float(alpha)
  15. int(nbpass)
  16. int(diment)
  17. ### fin des structures de donnees ####################################
  18. ######################################################################
  19. ### fonctions mathematiques##############
  20. def sigmo(a):
  21.     float(a)
  22.     aux=math.exp(coef*a)
  23.     return ((aux-1)/(aux+1))
  24. def deriv(fa):
  25.     float(fa)
  26.     return(coed*(1+fa)*(1-fa))
  27. ### procedures d'initialisation##########
  28. def initNeurone(i,k):
  29.     int(i)
  30.     int(j)
  31.     int(k)
  32.     print("initialisation du neurone ",i+1,k)
  33.     res.couche[k].neurone[i].nbent=res.couche[k-1].nbneu;
  34.     res.couche[k].neurone[i].x=(double*)malloc(sizeof(double)*res.couche[k].neurone[i].nbent);
  35.     res.couche[k].neurone[i].w=(double*)malloc(sizeof(double)*res.couche[k].neurone[i].nbent);;
  36.     for j=0 in range(nbent):
  37.         res.couche[k].neurone[i].w[j]=0.6*rand()/RAND_MAX-0.3;  #poids initiaux dans [-0.3;+0.3]
  38.          print("w[",i,",",j,",",k,"]=",res.couche[k].neurone[i].w[j])
  39. def initCouche(k):
  40.     print("initialisation de la couche ",k)
  41.     if k==0: #couche d'entree
  42.         # couche k = diment
  43.     elif k==nbcou-1: #couche de sortie
  44.         # couche k = dimsor
  45.     else :
  46.         print("Nombre de neurones dur la couche cachee ",k," : " , --> )#res.couche[k].nbneu#
  47.         print("Nombre de neurones sur la couche cachee ",k, nbneu , file=fres)
  48.     res.couche[k].neurone=(strucNeurone*)malloc(sizeof(strucNeurone)*res.couche[k].nbneu)
  49.     if k>0:
  50.         for i in range(nbneu): # initiakisation de chaque neurone i de la couche k
  51.             print("appel initNeurone avec i=",i," et k=",k)
  52.             initNeurone(i,k)
  53. def initReseau():
  54.     int(k)
  55.     int(nbcach)
  56.     print("initialisation du reseau MLP" )
  57.     print("Nombre de couches cachees : ",nbcach)
  58.     res.nbcou=nbcach+2
  59.     print("Nombre de couches cachees : ", nbcach , file=fres)
  60.     res.couche=(strucCouche*)malloc(sizeof(strucCouche)*(nbcach+2))
  61.     for k=0 in range(nbcouch):
  62.         print("appel initCouche avec k=",k)
  63.         initCouche(k)
  64. def initBase(nomfich,base):
  65.     int(i)
  66.     int(j)
  67.     str(c)
  68.     print("Lecture des motifs , a partir du fichier ",nomfich)
  69.     fich=open(nomfich,"r" )
  70.     nbex=fich.readline(0)
  71.     print("nbex = ",nbex)
  72.     diment=fich.readline(1)
  73.     print("diment = ",diment)
  74.     base->xx=(double**)malloc(sizeof(double)*base->nbex);
  75.     base->sd=(double**)malloc(sizeof(double)*base->nbex);
  76.     for i in range(nbex): """ on lit l'un apres l'autre tous les ex de la base"""
  77.         { base->xx[i]=(double*)malloc(sizeof(double)*diment) """le vecteur des entrees suivi de ..."""
  78.         for j in range(diment):
  79.           fich.read(xx[i][j])
  80.         base->sd[i]=(double*)malloc(sizeof(double)*dimsor);"""...le vecteur des sorties desirees"""
  81.         for j in range(dimsor):
  82.         fich.read(sd[i][j])
  83.     fich.close()
  84.     print("Fin de la lecture des motifs" )   
  85.    
  86.    
  87.        
  88.    
  89. ### procedures de presentation d'un exemple au reseau #####
  90. def prezEntrees(numex , base ):
  91.           int(i)
  92. """les composantes de l'exemple numex sont les sorties des neurones de la couche 0 du reseau"""
  93.           for i in range(diment):
  94.               res.couche[0].neurone[i].s=base.xx[numex][i]
  95.          
  96. ### procedures de fonctionnement du resaeu ################
  97. def aller():
  98.     """passe avant : calcul de la sortie du reseau pour l exemple présenté"""
  99.     i=0
  100.     j=0
  101.     k=1
  102.     while k <nbcou:
  103.         while i <nbneu:
  104.           while j<nbent:
  105.               res.couche[k].neurone[i].x[j]=res.couche[k-1].neurone[j].s;
  106.                 res.couche[k].neurone[i].a+=res.couche[k].neurone[i].w[j]*res.couche[k].neurone[i].x[j];
  107.                 res.couche[k].neurone[i].s=sigmo(res.couche[k].neurone[i].a)
  108.               j+=1
  109.               i+=1
  110.               k+=1
  111.          
  112. def gradsor(numex):
  113.         """calcul des gradients d'erreur dur la couche de sortie"""
  114.           i=0
  115.           while i <dimsor:
  116.               dsig=deriv(res.couche[res.nbcou-1].neurone[i].s)
  117.               res.couche[res.nbcou-1].neurone[i].y=2*dsig*(app.sd[numex][i]-res.couche[res.nbcou-1].neurone[i].s)
  118.               i+=1
  119. def retour():
  120.           """passe arriere  calcul des gradients retropropages dans les couches cachees"""
  121.           int(i)
  122.           int(m)
  123.           int(k)
  124.            for (k=res.nbcou-2;k>0;k--)
  125.                 for (i=0;i<res.couche[k].nbneu;i++)
  126.                    dsig=deriv(res.couche[k].neurone[i].s);
  127.                     somm=0.0;
  128.                     for(m=0;m<res.couche[k+1].nbneu;m++)
  129.                       somm+=res.couche[k+1].neurone[m].w[i]*res.couche[k+1].neurone[m].y;
  130.                     res.couche[k].neurone[i].y=dsig*somm;
  131.          
  132.                
  133. def modifw():
  134.           """mise a jour des poids du reseau (toutes les couches)"""
  135.           i=0
  136.           j=0
  137.           k=1
  138.           while k <nbcou:
  139.               while i <nbneu:
  140.                   while j <nbent:
  141.                       res.couche[k].neurone[i].w[j]+=alpha*res.couche[k].neurone[i].y*res.couche[k].neurone[i].x[j]
  142.                       k+=1
  143.                       i+=1
  144.                       j+=1
  145. ### fonctions d'evaluation des performances ###############
  146. def tstsor(numex,base):
  147.           """resultat booleen cas ou il n'y a qu'une seule sortie valant -1 ou 1"""
  148.           if (res.couche[res.nbcou-1].neurone[0].s*base.sd[numex][0]>0):
  149.               return(1)
  150.           else :
  151.               return(0)
  152. def tauxSucces(base):
  153.           i=0
  154.           nbsuc=0
  155.           while i <nbex:
  156.               prezEntrees(i,base)
  157.               aller()
  158.               if tstor(i,base)==1:
  159.                   nbsuc+=1
  160.               i+=1
  161.           return nbsuc , base.nbex
  162. ### procedure de controle des processus d'apprentissage et de generalisation ###
  163. def appgen(nbpass):
  164.           p=0
  165.           i=0
  166.           while p<nbpass:
  167.               print("Passe n°",p+1)
  168.               print("Passe n°",p+1, file=fres)
  169.               while i <nbex:
  170.                   aller()
  171.                   gradsor(i)
  172.                   retour()
  173.                   modifw()
  174.                   i+=1
  175.               taux=tauxSucces(app)
  176.               print("taux app : ",taux)
  177.               print("taux app : ",taux,file=fres)
  178.               taux=tauxSucces(gen)
  179.               print("taux gen : ",taux)
  180.               print("taux gen : ",taux,file=fres)
  181.              
  182. ## programme principal
  183. def main():
  184.    
  185.     nomApp = input("Nom du fichier d'apprentissage : " )
  186.     nomGen = input("Nom du fichier de généralisation : " )
  187.     nomRes = input("Nom du fichier de résultats : " )
  188.     fres=open(nomRes,"w" )
  189.     fapp=open(nomApp,"r" )
  190.     fgen=open(nomGen,"r" )
  191.     print("Apprentissage sur : " , nomApp )
  192.     print("Généralisation sur : ", nomGen )
  193.     alpha = input("Valeur du pas de gradient : " )
  194.     print("Valeur du pas de gradient : ", alpha , file = fres )
  195.    
  196.    
  197.     nbpass = int(input("Nombre de passes dans la base d'exemples : " ))
  198.     print("Nombre de passes dans la base d'exemples : ", nbpass , file = fres )
  199.     diment = int(input("Taille de la couche d'entree = " ))
  200.     print("Taille de la couche d'entree = ", diment , file = fres )
  201.    
  202.     dimsor = int(input("Taille de la couche de sortie = " ))
  203.     print("Taille de la couche de sortie = ", dimsor , file = fres )
  204.     fres.close()
  205.     fapp.close()
  206.     fgen.close()
  207. main() 
  208.    
  209. ## fin du programme ###############

Reply

Marsh Posté le 10-03-2016 à 18:52:31    

aaronprince a écrit :

Je dois écrire un programme en python pour faire un résau MLP (multilayer perceptron) en m'inspirant d'un code écrit en c


en t'inspirant ou en copiant/traduisant (dans un autre language)?
 

Citation :

le probleme est que je n'ai aucune connaissance en C


C'est embêtant... Ce ne sont pas les tutos de C qui manquent sur internet, bon courage... (On peut certainement discuter si tel ou tel tuto permet d'apprendre le C correctement, mais pour comprendre à peu près ça devrait suffire je dirait.)
 
Je ne parle pas Python, mais je ne pense pas que faire du mélange de C et de Python (comme dans ta réponse) soit la bonne méthode. Autant que ceci

Code :
  1. int(i)

(vu à de multiples reprises) ne fait très probablement pas ce que tu veux (déclarer une variable). doc Python...
 
Je suppose que c'est un exercice et non un problème réel à résoudre? Car dans le deuxième cas il est certainement possible d'appeller le programme issu du code C depuis Python.

Reply

Marsh Posté le 10-03-2016 à 19:49:14    

effectivement je me ssuis rendue compte de int(i) qui servais "a rien" en python ainsi que de nombreuses autres "erreurs" de ma part avec le for ... en revanche je dois réellemnt programmer un MLP en python en me basant sur cet algorithme en C :(  
Je comprends ce qu'il fait ou et quand mais certaines structures restent "obscures" : notamment cette partie:
typedef struct // -- structure d'un neurone --
{
    int nbent;  //nombre d'entrees du neurone
    double *x;  //tableau des entrees X
    double *w;  //tableau des poids W
    double a;   //activation (somme ponderee des entrees = somme(WiXi))
    double s;   //sortie (fonction sigmoide de l'activation =f(a))
    double y;   //gradient
}strucNeurone;
typedef struct // -- structure d'une couche --
{
    int nbneu;      //nombre de neurones
    strucNeurone *neurone;  //tableau de neurones
}strucCouche;
typedef struct // -- structure d'un reseau --
{
  int nbcou;        //nombre de couches
  strucCouche *couche;  //tableau de couches
}strucReseau;
typedef struct // -- base d'exemples --
{
  int nbex;     //nombre d'exemples
  double **xx;  //vecteurs des entrees
  double **sd;  //vecteurs des sorties desirees
}strucBase;
strucReseau res;  //le reseau MLP
char nficapp[maxcar]; //nom du fichier d'apprentissage
char nficgen[maxcar]; //nom du fichier de generalisation
strucBase app,gen;    //les bases d'apprentissage et de generalisation
char nresult[maxcar]; //nom du fichier de stockage des resultats
FILE *ficresu;        //fichier dans lequel on stockera les parametres et les resultats
float alpha;  //coefficient d'apprentissage (pas de gradient)
int nbpass;   //nombre de passes de la base d'exemples
int diment;   //dimension d'entree
 
je comprends ce qu'elle fait mais je parviens pas à la traduire  
et puis :
 base->xx=(double**)malloc(sizeof(double)*base->nbex);
  base->sd=(double**)malloc(sizeof(double)*base->nbex);
 
là par contre ça s'apparente à du chinois pour moi :heink:  
 
et pour ça je comprends mais je vois pas comment traduire:
 for (k=1;k<res.nbcou;k++)
    for (i=0;i<res.couche[k].nbneu;i++)
      { res.couche[k].neurone[i].a=0.0;
    for (j=0;j<res.couche[k].neurone[i].nbent;j++)
      { res.couche[k].neurone[i].x[j]=res.couche[k-1].neurone[j].s;
        res.couche[k].neurone[i].a+=res.couche[k].neurone[i].w[j]*res.couche[k].neurone[i].x[j];
      }
    res.couche[k].neurone[i].s=sigmo(res.couche[k].neurone[i].a);
      }
 
 
:pfff:  je garde espoir d'une illumination soudaine :sol:

Reply

Marsh Posté le 11-03-2016 à 08:02:25    

Bonjour !
 
La partie "tableau" en C est toujours un peu problématique si on n'a pas les idées claires sur les pointeurs et la gestion de la mémoire :)
 
Mais rassurez-vous, pour peu que j'aie bien compris ce que j'ai lu, les tableaux (listes) en Python sont dynamiques, donc vous pouvez remplacer les "double *" ou "structNeurone *" par des listes de doubles / de "structNeurone" et ne pas tenir compte des instructions "malloc" (au passage, vous avez faire une erreur en les recopiant, ce qui m'a mis le doute en lisant votre message, j'ai été obligé de revenir au message de base pour vérifier qu'il n'y avait pas un truc douteux quelque part :) )
 
Comme je ne sais pas comment marchent les structures (ou leur équivalent) en Python, je laisse la place à d'autres, plus calés que moi dans ce langage.  
 
Bonne continuation !


---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 11-03-2016 à 22:33:59    

Déjà le code C est faux (il ne marche que si on est en architecture 64 bits, ou sizeof(double) est égal à sizeof(double*)):

Code :
  1. base->xx=(double**)malloc(sizeof(double)*base->nbex);
  2. base->sd=(double**)malloc(sizeof(double)*base->nbex);


Alors que ce devrait être:

Code :
  1. base->xx = (double**) malloc(sizeof(double*) * base->nbex);
  2. base->sd = (double**) malloc(sizeof(double*) * base->nbex);


Perso, j'aurais codé ainsi:

Code :
  1. base->xx = malloc(base->nbex * sizeof(double*));
  2. base->sd = malloc(base->nbex * sizeof(double*));


Bref, base->xx va pointer sur une zone contenant base->nbex pointeur sur un ou des doubles.
 
C'est un point de détail, mais autant partir d'un programme qui soit juste.
 
Pour tes structures
typedef struct // -- structure d'un reseau --
{
  int nbcou;        //nombre de couches
  strucCouche *couche;  //tableau de couches
}strucReseau;
...
strucReseau res;
 
En général, un struct se traduira par une classe en python
bref, ici, tu vas avoir un objet res qui a pour structure strucReseau, structure qui aux yeux du programmeur C est transparente: c'est une liste d'objets dont on ne connait pas la taille à la création (en C on maintiendra la taille dans la variable nbcou, en python, on a pas besoin de la faire).
Donc tu vas avoir une classe Reseau avec un membre couche qui est une liste vide au départ, et que tu vas peupler d'objets d'une nouvelle classe Couche
 
Bon maintenant, il va falloir voir  strucCouche
typedef struct // -- structure d'une couche --
{
    int nbneu;      //nombre de neurones
    strucNeurone *neurone;  //tableau de neurones
}strucCouche;
Donc même type de structure, tu vas avoir une classe Couche avec un membre couche qui est une liste vide au départ, et que tu vas peupler d'objets d'une nouvelle classe Neurone
 
Et si on va voir strucNeurone
typedef struct // -- structure d'un neurone --
{
    int nbent;  //nombre d'entrees du neurone
    double *x;  //tableau des entrees X
    double *w;  //tableau des poids W
    double a;   //activation (somme ponderee des entrees = somme(WiXi))
    double s;   //sortie (fonction sigmoide de l'activation =f(a))
    double y;   //gradient
}strucNeurone;
La classe Neurone va avoir 6 champs, dont deux listes de floats, x et w
 
Bon, je ne programma jamais en python, mais comme ça fait un bon exercice pour s'exercer, j'ai pondu le début (un programmeur expert python saurait surement mieux écrire ça que moi):

Code :
  1. import os
  2. import sys
  3.  
  4. def dimsor():
  5.    return 1
  6.  
  7. nficapp = input("Nom du fichier d'apprentissage : " )
  8. nficgen = input("Nom du fichier de generalisation : " )
  9. nresult = input("Nom du fichier de resultat : " )
  10. try:
  11.    ficresu = open(nresult, 'w')
  12. except IOError:
  13.    print(e)
  14.    sys.exit(0)
  15.  
  16. class Base:
  17.    "Base d'exemples"
  18.    def __init__(self, fichier):
  19.        try:
  20.            print("Lecture des motifs, a partir du fichier {}\n".format(fichier))
  21.            f = open(fichier, 'r')
  22.        except IOError as e:
  23.            print(e)
  24.            raise IOError
  25.        else:
  26.            self.nbex = [int(x) for x in f.readline().split()][0]
  27.            self.diment = [int(x) for x in f.readline().split()][0]
  28.            self.dimsor = dimsor()
  29.            self.entrees = []
  30.            self.sorties_desirees = []
  31.            for i in range(self.nbex):
  32.                temp = [float(x) for x in f.readline().split()]
  33.                # les self.diment premières valeurs
  34.                self.entrees.append(temp[:self.diment])
  35.                # les self.dimsor valeurs suivantes
  36.                self.sorties_desirees.append(temp[self.diment:][:self.dimsor])
  37.            f.close()
  38.            print("fin de la lecture des motifs\n" )
  39.  
  40.    def __repr__(self):
  41.        from pprint import pformat
  42.        return pformat(vars(self))
  43.  
  44. ficresu.write("Apprentissage sur {}\t".format(nficapp))
  45. print("\n -- Creation de la base, pour les donnees d'apprentissage\n" )
  46. try:
  47.    base_app = Base(nficapp)
  48. except IOError:
  49.    ficresu.close()
  50.    sys.exit(0)
  51. ficresu.write("  [ {} exemples ]\n".format(base_app.nbex))
  52.  
  53. ficresu.write("Generalisation sur {}\t".format(nficgen))
  54. print("\n -- Creation de la base, pour les donnees de generalisation\n" )
  55. try:
  56.    base_gen = Base(nficgen)
  57. except IOError:
  58.    # detruire proprement base_app aussi
  59.    ficresu.close()
  60.    sys.exit(0)
  61. ficresu.write("  [ {} exemples ]\n".format(base_gen.nbex))
  62.  
  63. alpha = input("\nValeur du pas de gradient : " )
  64. ficresu.write("alpha = {}\t".format(alpha))
  65. nbpass = input("Nombre de passes de la base d'exemples : " )
  66. ficresu.write("nbpass = {}\n".format(nbpass))
  67. ficresu.write("Taille de la couche d'entree = {}\n".format(base_gen.diment))
  68. ficresu.write("Taille de la couche de sortie = {}\n".format(base_gen.dimsor))
  69.  
  70. # Bon, je vais pas tout faire
  71.  
  72. ficresu.close()    
  73.  
  74. # os.system("pause" )


J'espère que ça va te donner des idées pour la suite.
 
Note: Comme je ne connais pas la structure des fichiers base d'exemple, j'ai supposé dans cette ligne
temp = [float(x) for x in f.readline().split()]
que a partir de la troisième ligne, chaque ligne contient une ligne exemple, constituée des valeurs en entrée suivie des valeurs de sortie désirées
Si le fichier a une structure différente (par exemple, les valeurs en entrée et celles de sortie désirées sur deux lignes différentes), adapter le code de lecture des lignes.
 
A+,


Message édité par gilou le 11-03-2016 à 23:31:19

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-03-2016 à 12:42:28    

Merci ! je pense voir comment faire je m'y remet avec serieux dès ce soir et je donne de mes nouvelles :D :bounce:

Reply

Marsh Posté le 14-03-2016 à 21:17:24    

Bon j'ai fait ça mais quand je le lance j'ai une erreur : python me dit que diment n'existe pas alors que si !  :(  

Code :
  1. import os
  2. import sys
  3. import math
  4. def dimsor():
  5.     return 1
  6. nficapp = input("Nom du fichier d'apprentissage : " )
  7. nficgen = input("Nom du fichier de generalisation : " )
  8. nresult = input("Nom du fichier de resultat : " )
  9. try:
  10.     ficresu = open(nresult, 'w')
  11. except IOError:
  12.     print(e)
  13.     sys.exit(0)
  14. class Base:
  15.     "Base d'exemples"
  16.     def __init__(self, fichier):
  17.         try:
  18.             print("Lecture des motifs, a partir du fichier {}\n".format(fichier))
  19.             f = open(fichier, 'r')
  20.         except IOError as e:
  21.             print(e)
  22.             raise IOError
  23.         else:
  24.             self.nbex = [int(x) for x in f.readline().split()][0]
  25.             self.diment = [int(x) for x in f.readline().split()][0]
  26.             self.dimsor = dimsor()
  27.             self.entrees = []
  28.             self.sorties_desirees = []
  29.             for i in range(self.nbex):
  30.                 temp = [float(x) for x in f.readline().split()]
  31.                 # les self.diment premières valeurs
  32.                 self.entrees.append(temp[:self.diment])
  33.                 # les self.dimsor valeurs suivantes
  34.                 self.sorties_desirees.append(temp[self.diment:][:self.dimsor])
  35.             f.close()
  36.             print("fin de la lecture des motifs\n" )
  37.     def __repr__(self):
  38.         from pprint import pformat
  39.         return pformat(vars(self))
  40. ficresu.write("Apprentissage sur {}\t".format(nficapp))
  41. print("\n -- Creation de la base, pour les donnees d'apprentissage\n" )
  42. try:
  43.     base_app = Base(nficapp)
  44. except IOError:
  45.     ficresu.close()
  46.     sys.exit(0)
  47. ficresu.write("  [ {} exemples ]".format(base_app.nbex))
  48. print(base_app)
  49. ficresu.write("Generalisation sur {}\t".format(nficgen))
  50. print("\n -- Creation de la base, pour les donnees de generalisation\n" )
  51. try:
  52.     base_gen = Base(nficgen)
  53. except IOError:
  54.     # detruire proprement base_app aussi
  55.     ficresu.close()
  56.     sys.exit(0)
  57. ficresu.write("  [ {} exemples ]".format(base_gen.nbex))
  58. print(base_gen)
  59. alpha = input("\nValeur du pas de gradient : " )
  60. ficresu.write("alpha = {}\t".format(alpha))
  61. nbpass = input("Nombre de passes de la base d'exemples : " )
  62. ficresu.write("nbpass = {}\n".format(nbpass))
  63. ficresu.write("Taille de la couche d'entree = {}\n".format(base_gen.diment))
  64. ficresu.write("Taille de la couche de sortie = {}\n".format(base_gen.dimsor))
  65. # fonctions mathématiques
  66. def sigmo(a):
  67.     aux = exp(coef*a)
  68.     print("sigmo = ",((aux-1)/(aux+1)))
  69.     return ((aux-1)/(aux+1))
  70. def deriv(fa):
  71.     print("deriv = ",(coed*(1+fa)*(1-fa)))
  72.     return (coed*(1+fa)*(1-fa))
  73. # procédures d'initialisation
  74. def initNeurone(i,k):
  75.     for j in range(0,nbent):
  76.         neurone = [[]]
  77.         neurone[j] =[ base_app[i],base_app[i+1]]
  78. def initCouche(k):
  79.     global nbneucach
  80.     print("initialisation de la couche ", k)
  81.     if k==0:
  82.         nbneu = diment
  83.     if k==nbcou-1:
  84.         nbneu = dimsor
  85.     else :
  86.         nbcach = int(input("Nombre de neurones sur la couche cachee : " ))
  87.         print("Nombre de neurones sur la couche cachee : ", nbneucach , file = ficresu)
  88.    
  89.     for i in range(0,nbneu):
  90.          initNeurone(i,k)
  91. def initReseau():
  92.     print("initialisation du reseau MLP\n" )
  93.     nbcoucach=int(input(("Nombre de couches cachees : " )))
  94.     nbcou=nbcoucach+2
  95.     print("Nombre de couches cachees : ",nbcoucach , file = ficresu)
  96.     for k in range(0,nbcou):
  97.         initCouche(k)
  98.                  
  99.    
  100. initReseau()   
  101. ficresu.close()

Reply

Marsh Posté le 14-03-2016 à 22:09:30    

Ben clairement pas pour cette ligne:  
nbneu = diment
 
Et je vois pas de classe pour Reseau, Couche ni Neurone
 
A+,


Message édité par gilou le 14-03-2016 à 22:11:55

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-03-2016 à 13:38:56    

Re bonjour !  :)  
j'ai modifier des trucs et crée une classe structure pour lee neurones , couches et pour le reseau seulement je suis pas sûr que ce soit correct  
je n'arrive pas à trouver la syntaxe pour appeler nbent dans

Code :
  1. def initNeurone(i,k):
  2.     print("initialisation du neurone ",i+1,"de la couche ",k)
  3.     for j in range(0,self.nbent):


 
Je me sens vraiment nul  :(  heureusement que tu me donne des indications ! :)  

Code :
  1. import os
  2. import sys
  3. import math
  4. import random
  5. def dimsor():
  6.     return 1
  7. nficapp = input("Nom du fichier d'apprentissage : " )
  8. nficgen = input("Nom du fichier de generalisation : " )
  9. nresult = input("Nom du fichier de resultat : " )
  10. try:
  11.     ficresu = open(nresult, 'w')
  12. except IOError:
  13.     print(e)
  14.     sys.exit(0)
  15. class Base:
  16.     "Base d'exemples"
  17.     def __init__(self, fichier):
  18.      
  19.         print("Lecture des motifs, a partir du fichier ",fichier)
  20.         f = open(fichier, 'r')
  21.         self.nbex = [int(x) for x in f.readline().split()][0]
  22.         self.diment = [int(x) for x in f.readline().split()][0]
  23.         self.dimsor = dimsor()
  24.         self.entrees = []
  25.         self.sorties_desirees = []
  26.         for i in range(self.nbex):
  27.             temp = [float(x) for x in f.readline().split()]
  28.             # les self.diment premières valeurs
  29.             self.entrees.append(temp[:self.diment])
  30.             # les self.dimsor valeurs suivantes
  31.             self.sorties_desirees.append(temp[self.diment:][:self.dimsor])
  32.         f.close()
  33.         print("fin de la lecture des motifs\n" )
  34.     def __repr__(self):
  35.         from pprint import pformat
  36.         return pformat(vars(self))
  37. print("Apprentissage sur ",nficapp,file = ficresu)
  38. print(" -- Creation de la base, pour les donnees d'apprentissage" )
  39. base_app = Base(nficapp)
  40. print("  [  exemples ]",base_app.nbex,file = ficresu)
  41. print(base_app)
  42. print("Generalisation sur ",nficgen,file = ficresu)
  43. print("-- Creation de la base, pour les donnees de generalisation" )
  44. base_gen = Base(nficgen)
  45. print("  [  exemples ]",base_gen.nbex,file = ficresu)
  46. print(base_gen)
  47. alpha = input("Valeur du pas de gradient : " )
  48. print("alpha = ",alpha, file = ficresu)
  49. nbpass = input("Nombre de passes de la base d'exemples : " )
  50. print("nbpass = ",nbpass, file = ficresu)
  51. print("Taille de la couche d'entree = ",base_gen.diment, file = ficresu)
  52. print("Taille de la couche de sortie = ",base_gen.dimsor , file = ficresu)
  53. class Struct:
  54.     "definition de la structure du reseau"
  55.     def __init__(self,neurone,couche,reseau,base,MLP):
  56.         #structure d'un neurone
  57.         self.nbent=len(base_app.entrees)
  58.         self.x=[]
  59.         self.w=[]
  60.         self.a=sum(w[i]*x[i])
  61.         self.s=sigmo(a)
  62.         self.y=ampha
  63.         #structure d'une couche
  64.         self.nbneu=int(nbneu)
  65.         self.neurone=[]
  66.         #structure d'un reseau
  67.         self.nbcou=int(nbcou)
  68.         self.couche=[]
  69.         #structure de la base d'exemples
  70.         self.nbex=int(nbex)
  71.         self.xx=[[]]
  72.         self.sd=[[]]
  73.         #le reseau MLP
  74.         self.alpha=float(alpha)
  75.         self.nbpass=int(nbpass)
  76.         self.diment=int(diment)
  77.        
  78.        
  79.    
  80.    
  81. # fonctions mathématiques
  82. def sigmo(a):
  83.     aux = exp(coef*a)
  84.     print("sigmo = ",((aux-1)/(aux+1)))
  85.     return ((aux-1)/(aux+1))
  86. def deriv(fa):
  87.     print("deriv = ",(coed*(1+fa)*(1-fa)))
  88.     return (coed*(1+fa)*(1-fa))
  89. # procédures d'initialisation
  90. def initNeurone(i,k):
  91.     print("initialisation du neurone ",i+1,"de la couche ",k)
  92.     for j in range(0,self.nbent):
  93.         neurone = [[]]
  94.         neurone[j] =[ base_app[i],base_app[i+1]]
  95.         w[j] = random(-0.3,0.3)
  96.        
  97. def initCouche(k):
  98.     global nbneucach
  99.     print("initialisation de la couche ", k)
  100.     if k==0:
  101.         nbneu = base_app.diment
  102.     if k==nbcou-1:
  103.         nbneu = dimsor()
  104.     else :
  105.         nbneucach = int(input("Nombre de neurones sur la couche cachee : " ))
  106.         print("Nombre de neurones sur la couche cachee : ", nbneucach , file = ficresu)
  107.    
  108.     for i in range(0,nbneu):
  109.          initNeurone(i,k)
  110. def initReseau():
  111.     global nbcou
  112.     print("initialisation du reseau MLP\n" )
  113.     nbcoucach=int(input(("Nombre de couches cachees : " )))
  114.     nbcou=nbcoucach+2
  115.     print("Nombre de couches cachees : ",nbcoucach , file = ficresu)
  116.     for k in range(0,nbcou):
  117.         initCouche(k)
  118.                  
  119.    
  120. initReseau()   
  121. ficresu.close()

Reply

Marsh Posté le 15-03-2016 à 13:38:56   

Reply

Marsh Posté le 15-03-2016 à 16:33:01    

Enfin je sais pas, mais ça me semble pourtant simple:
 
Vous allez définir une classe réseau
 
class Reseau:
....
 
Et au lieu de faire un  
def initReseau():
vous allez faire un  
def __init__(self,...)
dans la classe Reseau
 
L'init de la classe Reseau va utiliser des objets d'une nouvelle classe, Couche, qu'il va falloir définir, et l'init de la classe Couche va utiliser des objets d'une nouvelle classe, Neurone, qu'il va falloir définir aussi.
Si les deux fichiers de données (odeur8.app, odeur8.gen) ne sont pas trop gros, pourriez-vous les poster sur pastebin? que ça donne de quoi tester.
 
A+,


Message édité par gilou le 15-03-2016 à 16:39:36

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-03-2016 à 20:26:21    

alors voila pour les fichiers: (je trouve pas comment les ajouter) :
84
31
1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1
-1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1
-1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1
-1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1
-1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
-1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
-1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1
-1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1
1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
-1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
-1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1
-1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
-1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1
1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
-1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1
-1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
-1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
-1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
-1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
-1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
-1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
-1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1
-1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
-1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1
-1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1
-1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 1
-1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
-1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
-1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
-1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1
-1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1
1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
-1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
-1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
-1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 1
-1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
-1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 1
1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
-1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
-1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
-1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1
-1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1
-1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 1
-1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1
-1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1
-1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
-1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1
-1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
-1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
 
 
et pour la generalisation :
21
31
-1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
-1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
-1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
-1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 1
-1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1
-1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
-1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
-1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
-1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
-1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
-1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
 

Reply

Marsh Posté le 15-03-2016 à 22:53:54    

J'ai fait des classes et implémenter les autres fonctions néamoins j'ai plusieurs erreurs de syntaxes (je sais pas comment reussir à appeler diment par exemple et puis ensuite je suis pas certaine pour les res.couche[k].neurone[i].a  :( :

Code :
  1. import os
  2. import sys
  3. import math
  4. import random
  5. def dimsor():
  6.     return 1
  7. nficapp = input("Nom du fichier d'apprentissage : " )
  8. nficgen = input("Nom du fichier de generalisation : " )
  9. nresult = input("Nom du fichier de resultat : " )
  10. try:
  11.     ficresu = open(nresult, 'w')
  12. except IOError:
  13.     print(e)
  14.     sys.exit(0)
  15. class Base:
  16.     "Base d'exemples"
  17.     def __init__(self, fichier):
  18.      
  19.         print("Lecture des motifs, a partir du fichier ",fichier)
  20.         f = open(fichier, 'r')
  21.         self.nbex = [int(x) for x in f.readline().split()][0]
  22.         self.diment = [int(x) for x in f.readline().split()][0]
  23.         self.dimsor = dimsor()
  24.         self.entrees = []
  25.         self.sorties_desirees = []
  26.         for i in range(self.nbex):
  27.             temp = [float(x) for x in f.readline().split()]
  28.             # les self.diment premières valeurs
  29.             self.entrees.append(temp[:self.diment])
  30.             # les self.dimsor valeurs suivantes
  31.             self.sorties_desirees.append(temp[self.diment:][:self.dimsor])
  32.         f.close()
  33.         print("fin de la lecture des motifs\n" )
  34.     def __repr__(self):
  35.         from pprint import pformat
  36.         return pformat(vars(self))
  37. print("Apprentissage sur ",nficapp,file = ficresu)
  38. print(" -- Creation de la base, pour les donnees d'apprentissage" )
  39. base_app = Base(nficapp)
  40. print("  [  exemples ]",base_app.nbex,file = ficresu)
  41. print(base_app)
  42. print("Generalisation sur ",nficgen,file = ficresu)
  43. print("-- Creation de la base, pour les donnees de generalisation" )
  44. base_gen = Base(nficgen)
  45. print("  [  exemples ]",base_gen.nbex,file = ficresu)
  46. print(base_gen)
  47. alpha = input("Valeur du pas de gradient : " )
  48. print("alpha = ",alpha, file = ficresu)
  49. nbpass = input("Nombre de passes de la base d'exemples : " )
  50. print("nbpass = ",nbpass, file = ficresu)
  51. print("Taille de la couche d'entree = ",base_gen.diment, file = ficresu)
  52. print("Taille de la couche de sortie = ",base_gen.dimsor , file = ficresu)
  53. coef = 2.0
  54. coed = 1.0
  55. class StrucNeurone:
  56.     def __init__(self):
  57.         self.nbent = 0
  58.         self.x = []
  59.         self.w = []
  60.         self.a = 0
  61.         self.s = 0
  62.         self.y = 0
  63. class StrucCouche:
  64.     def __init__(self):
  65.         self.nbneu = 0
  66.         self.neurone = []
  67. class StrucReseau:
  68.     def __init__(self):
  69.         self.nbcou = 0
  70.         self.couche = []
  71. class Res:
  72.     def __init__(self):
  73.         self.nficapp = nomApp
  74.         self.nficgen = nomGen
  75.        
  76. neurone  = StrucNeurone()
  77. couche = StrucCouche()
  78. res = StrucReseau()
  79.        
  80.        
  81.    
  82.    
  83. # fonctions mathématiques
  84. def sigmo(a):
  85.     aux = exp(coef*a)
  86.     print("sigmo = ",((aux-1)/(aux+1)))
  87.     return ((aux-1)/(aux+1))
  88. def deriv(fa):
  89.     print("deriv = ",(coed*(1+fa)*(1-fa)))
  90.     return (coed*(1+fa)*(1-fa))
  91. # procédures d'initialisation
  92. # fonctions mathématiques
  93. def sigmo(a):
  94.     aux = exp(coef*a)
  95.     print("sigmo = ",((aux-1)/(aux+1)))
  96.     return ((aux-1)/(aux+1))
  97. def deriv(fa):
  98.     print("deriv = ",(coed*(1+fa)*(1-fa)))
  99.     return (coed*(1+fa)*(1-fa))
  100. # procédures d'initialisation
  101. def initNeurone(i,k):
  102.     print("initialisation du neurone ",i+1,"de la couche ",k)
  103.     res.couche[k].neurone[i].nbent=res.couche[k-1].nbneu
  104.     for j in range(0,res.couche[k].neurone[i].nbent):
  105.         res.couche[k].neurone[i].w[j]=0.6*rand()
  106.         print("w[",i,",",j,",",k,"] = ",res.couche[k].neurone[i].w[j])
  107. def initCouche(k):
  108.     print("initialisation de la couche ",k)
  109.     if k==0:                 ## couche d'entree
  110.         res.couche[k].nbneu=Base.diment;
  111.     elif k==res.nbcou-1 : ## couche de sortie
  112.         res.couche[k].nbneu=dimsor();
  113.     else :                ##couches cachees
  114.      res.couche[k].nbneu=dimcach
  115.     if k>0:
  116.         for i in range(0,res.couche[k].nbneu) : ##initialisation de chaque neurone i de la couche k
  117.             print(" -- appel initNeurone avec i=",i," et k=",k)
  118.             initNeurone(i,k)
  119. def initReseau():
  120.     print("initialisation du reseau MLP" )
  121.     nbcach = int(input("Nombre de couches cachees : " ))
  122.     print("Nombre de couches cachees : ",nbcach,file = ficresu)
  123.     res.nbcou = nbcach + 2
  124.     for k in range(0,res.nbcou):
  125.         print("Appel initCouche avec k=",k)
  126.         initCouche(k)
  127. def prezEntrees(numex , base):
  128.     for i in range(1,base.diment):
  129.         res.couche[0].neurone[i].s=base.entrees[numex][i]
  130. def aller():
  131.     for k in range(1,res.nbcou):
  132.         res.couche[k].neurone[i].a=0.0
  133.         for j in range(0,res.couche[k].neurone[i].nbent):
  134.             res.couche[k].neurone[i].x[j]=res.couche[k-1].neurone[j].s
  135.             res.couche[k].neurone[i].a+=res.couche[k].neurone[i].w[j]*res.couche[k].neurone[i].x[j]
  136.         res.couche[k].neurone[i].s=sigmo(res.couche[k].neurone[i].a)
  137. def gradsor(numex):
  138.     for i in range(0,dimsor):
  139.         dsig = deriv(res.couche[res.nbcou-1].neurone[i].s)
  140.         res.couche[res.nbcou-1].neurone[i].y=2*dsig*(app.sd[numex][i]-res.couche[res.nbcou-1].neurone[i].s)
  141. def retour():
  142.     for k in range(0,res.nbcou-2):
  143.         for i in range(0,res.couche[k].nbneu):
  144.             dsig = deriv(res.couche[k].neurone[i].s)
  145.             somm = 0.0
  146.             for m in range(0,res.couche[k].nbneu):
  147.                 somm+=res.couche[k+1].neurone[m].w[i]*res.couche[k+1].neurone[m].y
  148.             res.couche[k].neurone[i].y=dsig*somm
  149. def modifiw():
  150.     for k in range(1,res.nbcou):
  151.         for i in range(0,res.couche[k].nbneu):
  152.             for j in range(0,res.couche[k].neurone[i].nbent):
  153.                 res.couche[k].neurone[i].w[j]+=alpha*res.couche[k].neurone[i].y*res.couche[k].neurone[i].x[j]
  154. def tstsor(numex,base):
  155.     if (res.couche[res.nbcou-1].neurone[0].s*base.sd[numex][0])>0:
  156.         return 1
  157.     else :
  158.         return 0
  159. def tauxSucces(base):
  160.     nbsuc = 0
  161.     for i in range(0,base.nbex):
  162.         prezEntrees(i,base)
  163.         aller()
  164.         if tstsor(i,base) == 1:
  165.             nbsuc+=1
  166.     return nbsuc/base.nbex
  167. def appgen(nbpass):
  168.     for p in range(0,nbpass):
  169.         print("passe n°:",p+1)
  170.         print("passe n°:",p+1,file = ficresu)
  171.         for i in range(app.nbex):
  172.             prezEntrees(i,app)
  173.             aller()
  174.             gradsor(i)
  175.             retour()
  176.             modifw()
  177.         taux = tauxSucces(app)
  178.         print("taux app : ",taux)
  179.         print("taux app : ",taux,file = ficresu)
  180.         taux = tauxSucces(gen)
  181.         print("taux gen : ",taux)
  182.         print("taux gen : ",taux,file = ficresu)
  183.        
  184.            
  185.                
  186.        
  187.    
  188.    
  189.            
  190.        
  191.    
  192. initReseau()   
  193. ficresu.close()

Reply

Marsh Posté le 16-03-2016 à 02:49:55    

Bon, en avançant un peu, si j'ai bien compris, ça devrait ressembler à ça:

Code :
  1. import os
  2. import sys
  3. import random
  4. import logging
  5.  
  6. from pprint import pformat
  7.  
  8. def dimsor():
  9.    return 1
  10.  
  11. class Neurone:
  12.    """
  13.    Un neurone est parametre par son nombre d'entrees
  14.    """
  15.    def __init__(self, nbent): # nombre d'entrees du neurone
  16.        self.x = [0.0 for _ in range(nbent)]                        # tableau des entrees X
  17.        self.w = [random.uniform(-0.3, 0.3) for _ in range(nbent)]  # tableau des poids W
  18.        self.a = 0.0  # activation (somme ponderee des entrees = somme(WiXi))
  19.        self.s = 0.0  # sortie (fonction sigmoide de l'activation =f(a))
  20.        self.y = 0.0  # gradient
  21.  
  22.    def __repr__(self):
  23.        return pformat(vars(self))
  24.  
  25. class Couche:
  26.    """
  27.    Une couche est parametree par son nombre de neurones
  28.    et le nombre d'entrees d'un neurone de la couche
  29.    """
  30.    def __init__(self, nbneu, nbent):
  31.        self.neurone = [Neurone(nbent) for _ in range(nbneu)]
  32.  
  33.    def __repr__(self):
  34.        return pformat(vars(self))
  35.  
  36. class Reseau:
  37.    """
  38.    Reseau neuronal
  39.    parametre par les dimensions en entree, en sortie, et en couches intermediaires
  40.    """
  41.    def __init__(self, diment, dimsor, dimcaches):
  42.        couches = [0, diment]
  43.        couches.extend(dimcaches)
  44.        couches.append(dimsor)
  45.        # faudra probablement passer en self.couches pour utilisation avec d'autres fonctions
  46.        # voire donner un autre nom pour pas confondre avec la liste qui suit
  47.        self.couche = [Couche(couches[i], couches[i-1]) for i in range(1, len(couches))]
  48.  
  49.    def __repr__(self):
  50.        return pformat(vars(self))
  51.  
  52. class Base:
  53.    """
  54.    Base d'exemples
  55.    """
  56.    def __init__(self, fichier):
  57.        try:
  58.            print("Lecture des motifs, a partir du fichier {}".format(fichier))
  59.            f = open(fichier, 'r')
  60.        except IOError as e:
  61.            print(e)
  62.            raise IOError
  63.        else:
  64.            self.nbex = [int(x) for x in f.readline().split()][0]
  65.            self.diment = [int(x) for x in f.readline().split()][0]
  66.            self.dimsor = dimsor()
  67.            self.entrees = []
  68.            self.sorties_desirees = []
  69.            for _ in range(self.nbex):
  70.                temp = [float(x) for x in f.readline().split()]
  71.                self.entrees.append(temp[:self.diment])
  72.                self.sorties_desirees.append(temp[self.diment:][:self.dimsor])
  73.            f.close()
  74.            print("fin de la lecture des motifs" )
  75.  
  76.    def __repr__(self):
  77.        return pformat(vars(self))
  78.  
  79.  
  80. ### nficapp = input("Nom du fichier d'apprentissage : " )
  81. nficapp = "odeur8.app"
  82. ### nficgen = input("Nom du fichier de generalisation : " )
  83. nficgen = "odeur8.gen"
  84. ### nresult = input("Nom du fichier de resultat : " )
  85. nresult = "odeurlog.txt"
  86. # on utilise le mecanisme de logging
  87. logging.basicConfig(
  88.    level = logging.INFO,
  89.    format = '%(message)s',
  90.    filename = nresult,
  91.    filemode = 'w'
  92. )
  93.  
  94.  
  95. print("\n -- Creation de la base, pour les donnees d'apprentissage" )
  96. try:
  97.    base_app = Base(nficapp)
  98. except IOError:
  99.    logging.critical("*** Erreur a l'ouverture du fichier d'apprentissage %s", nficapp)
  100.    sys.exit(0)
  101. logging.info("Apprentissage sur %s\t[ %d exemples ]", nficapp, base_app.nbex)
  102.  
  103.  
  104. print("\n -- Creation de la base, pour les donnees de generalisation" )
  105. try:
  106.    base_gen = Base(nficgen)
  107. except IOError:
  108.    logging.critical("*** Erreur a l'ouverture du fichier de generalisation %s", nficgen)
  109.    sys.exit(0)
  110. logging.info("Generalisation sur %s\t[ %d exemples ]", nficgen, base_gen.nbex)
  111.  
  112. ### alpha = input("\nValeur du pas de gradient : " )
  113. ### nbpass = input("Nombre de passes de la base d'exemples : " )
  114. ### logging.info("alpha = %d\t nbpass = %d", alpha, nbpass)
  115.  
  116. logging.info("Taille de la couche d'entree = %d", base_gen.diment)
  117. logging.info("Taille de la couche de sortie = %d", base_gen.dimsor)
  118.  
  119. print("\ninitialisation du reseau MLP" )
  120. ### nbcach = input("\nNombre de couches cachees : " )
  121. nbcach = 4
  122. dimcaches = []
  123. # couches cachees: parametrage par l'utilisateur
  124. for i in range(nbcach):
  125.    ### nbneu = input("\nNombre de neurones sur la couche cachee {} : ".format(i+1))
  126.    nbneu = 2
  127.    dimcaches.append(nbneu)
  128.    logging.info("Nombre de neurones sur la couche cachee %d : %d", i, nbneu)
  129. reseau = Reseau(base_gen.diment, base_gen.dimsor, dimcaches)
  130. # print(reseau)


les ### sont pour le code interactif que j'ai remplacé par du code de test
 
Ça devrait te donner une idée. Bon comme j'ai dit, je suis pas du tout programmeur python. Mais je me suis dit que ça faisait une bonne occase d'apprendre quelques trucs sur ce langage.
 
A+,


Message édité par gilou le 16-03-2016 à 16:45:15

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-03-2016 à 16:30:28    

Merci j'ai réussi à finir le programme et à le faire tourner (j'ai fait des modifs sur mon programme en m'inspirant de ce que tu avais fait ) ! :bounce:  
Merci pour toute ton aide :) Je suis vraiment nul en programmation meme toi qui n'en à jamais fait tu t'en sort mieux que moi ! :D  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed