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 :

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;
 
}
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
 
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
};
Le code me retourne donc bien une valeur pour le premier neurone, mais après, c'est "erreur de segmentation".

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 !!