Bonjour !
J'ai commencé à m'interesser au machine learning il y a quelques semaines avant de me mettre à en coder. Cependant, j'ai un petit problème : lorsque je donne des tailles de dataset trop grandes ou bien un trop gros nombre de répétitions lors d'un entrainement (en appelant la fonction gradient) le compilateur me renvoie la valeur "nan". J'ai cherché dans tous les recoins de mon code, recodé celui-ci en python mais en vain..
Je fais donc appelle à vous pour m'aider à trouver une solution à mon problème.
Voici le code :
Voici la réponse du compilateur :
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
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
84
85
86
87
88
89
90 #include <iostream> #include <vector> #include <stdlib.h> //dataset std::vector<double> inputs(100); std::vector<double> outputs(100); double a = 0; double b = 0; double alpha = 0.01; //fonction feedForward double feedForward(double x) { return a*x+b; } //Fonction coût double error(std::vector<double> _inputs, std::vector<double> _outputs) { double sum; double m = _inputs.size(); for(size_t i = 0; i < m; i++) { sum += (feedForward(_inputs[i])-_outputs[i])*(feedForward(_inputs[i])-_outputs[i]); } return (1/(2*m))*sum; } //dérivée partielle de l'erreur par rapport à a double dja(std::vector<double> _inputs, std::vector<double> _outputs) { double sum; double m = _inputs.size(); for(size_t i = 0; i < m; i++) { sum += inputs[i]*(a*inputs[i]+b-outputs[i]); } return (1/m)*sum; } //dérivée partielle de l'erreur par rapport à b double djb(std::vector<double> _inputs, std::vector<double> _outputs) { double sum; double m = _inputs.size(); for(size_t i = 0; i < m; i++) { sum += (a*inputs[i]+b-outputs[i]); } return (1/m)*sum; } //algorithme de descente de gradient void gradient(std::vector<double> _inputs, std::vector<double> _outputs) { a = a - alpha*dja(_inputs, _outputs); b = b - alpha*djb(_inputs, _outputs); } int main() { srand(time(0)); //valeur aléatoire pour a et b a = rand()/(0.01*RAND_MAX); b = rand()/(0.01*RAND_MAX); //remplissage du tableau for(size_t i = 0; i < inputs.size(); i++) { inputs[i] = i; outputs[i] = 3754.54*i+854; } //affichage des résultats //appel de la fonction gradient for(size_t i = 0; i < 10000; i++) { gradient(inputs, outputs); std::cout << "error : " << error(inputs, outputs) << std::endl; std::cout << "a : " << a << std::endl; std::cout << "b : " << b << std::endl; std::cout << std::endl; } }
N'hésitez pas nom plus à me donner des astuces pour améliorer mon code !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 error : -nan a : -nan b : -nan
Partager