Bonjour à tous,
J'essaye depuis peu de monter un RDN simple, sans prétention, mais paramétrable afin de mieu comprendre le sujet et de développer par la même mes compétences en C. Si j'ai choisi ce langage, c'est parce-que je suis familier avec lui et que je ne suis pas fan des langages haut niveau et/ou interprétés. Mon but étant de comprendre, je fais le choix de ne pas utiliser de librairies "clik and play" qui existent sûrement un peu partout.
J'ai donc procédé par étape : Neurone simple, couche, et réseau ; chacune étant représentée par une structure, une fonction d'initialisation et une fonction de calcul.
Je fais fonctionner un neurone simple sans soucis, de même, j'arrive à initialiser une couche. Cependant, lors du calcul d'une couche, j'ai une belle erreur de segmentation.
Voici le code :
J'ai supprimé le code "superflu", et, pour aider à la compréhension, les structures ci-dessous :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 void layer_compute(layer_t *lay, double *u_ent) { for(int i = 0; i < lay->layer_nb_ker; i++) { kernel_compute(&(lay->layer_ker[i]), u_ent); lay->layer_out[i]=lay->layer_ker[i].kor_out; } } double kernel_compute(kernel_t *kor, double *u_ent) { kor->kor_int[0] = kor->kor_zint; for(int i = 0; i < kor->kor_nb_int; i++) { kor->kor_int[i+1] = u_ent[i]; kor->kor_sum += (kor->kor_int[i+1] * kor->kor_win[i+1]); } kor->kor_sum += (kor->kor_int[0] * kor->kor_win[0]); kor->kor_out = heaviside(kor->kor_sum); return kor->kor_out; }
Le code me retourne donc bien une valeur pour le premier neurone, mais après, c'est "erreur de segmentation".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 typedef struct layer layer_t; typedef struct kernel kernel_t; struct layer { int layer_nb_int; // size of layer input vector int layer_nb_ker; // size of kernel vector short int layer_func; // layer function double *layer_int; // layer input vector double *layer_out; // layer output vector double *layer_win; // layer input weights kernel_t *layer_ker; // kernel vector }; struct kernel { short int kor_func; int kor_nb_int; // size of kernel input vector double kor_zint; // the 0 input value (default = -1) double *kor_int; // kernel input vector double *kor_win; // kernel input weights vector double kor_sum; // main kernel function result (sum) double kor_out; // kernel final computing result };
Les initialisations sont réalisée avec des tableaux dynamiques, cependant, lorsque je by-pass le layer et que je fais le calcul sur un simple neurone (initialisation et calcul), tout se déroule bien...
J'ai essayé de reprendre plusieurs fois mon code, mais je me retrouve toujours face à cette situation : dès que j'essaie de passer l'objet d'un objet, ça foire....
Quelqu'un saurait m'indiquer mon erreur ? Merci d'avance !!
Partager