diff --git a/main.cpp b/main.cpp index b90476f..3f68015 100644 --- a/main.cpp +++ b/main.cpp @@ -16,8 +16,8 @@ int main(int argc, char *argv[]) cout << "Bonjour et bienvenu" << endl; - Network network(2, 5); - network.forward({1.0,1.0,1.0,1.0,1.0}, {1.0,1.0,1.0,1.0,1.0}); + Network network(3, 3); + network.forward({1.0,1.0,1.0}, {1.0,2.0,3.0}); network.print(); /*Neuron n(3), n1(1), n2(1), n3(1); @@ -37,6 +37,6 @@ int main(int argc, char *argv[]) { cout << *it << endl; }*/ - + return 0; } diff --git a/myclasses.cpp b/myclasses.cpp index 7b0067e..cb15479 100644 --- a/myclasses.cpp +++ b/myclasses.cpp @@ -44,6 +44,30 @@ float Neuron::get_derror() return derror; } +void Neuron::set_nth_weight(int n, float value) +{ + int i=1; + forward_list::iterator current_weight(weights.begin()); + while(i::iterator current_weight(weights.begin()); + while(i::iterator &prev_layer_it, Activ activ_function) { weighted_sum = bias; @@ -139,6 +163,7 @@ bool Network::forward(const std::vector &input, const std::vector } } } + set_errors(target); return true; } @@ -160,13 +185,16 @@ bool Network::set_errors(const std::vector &target) { list>::reverse_iterator temp_next_layer = current_layer; //temp_next_layer set at current layer temp_next_layer--; //temp_next_layer set now at next layer + int neuron_counter=0; for(forward_list::iterator current_neuron(current_layer->begin()) ; current_neuron!=current_layer->end() ; ++current_neuron) {//inside current neuron + neuron_counter++; current_neuron->set_derror(0.0); for(forward_list::iterator next_layer_current_neuron(temp_next_layer->begin()) ; next_layer_current_neuron!=temp_next_layer->end() ; ++next_layer_current_neuron) { - // + current_neuron->set_derror( current_neuron->get_derror()+next_layer_current_neuron->get_derror()*next_layer_current_neuron->get_nth_weight(neuron_counter) ); } + current_neuron->set_derror( current_neuron->get_derror()*Tools::activation_function_derivative(h_activ,current_neuron->get_weighted_sum()) ); } } } @@ -175,6 +203,26 @@ bool Network::set_errors(const std::vector &target) bool Network::backward(float learning_rate) { + int layer_counter = layers.size()+1; + for(list>::reverse_iterator current_layer(layers.rbegin()) ; current_layer!=layers.rend() ; ++current_layer) + {//inside current layer + layer_counter--; + if(layer_counter>1) //all layers except input layer + { + list>::reverse_iterator temp_prev_layer = current_layer; //temp_prev_layer set at current layer + temp_prev_layer++; //temp_prev_layer set now at previous layer + int neuron_counter=0; + for(forward_list::iterator current_neuron(current_layer->begin()) ; current_neuron!=current_layer->end() ; ++current_neuron) + {//inside current neuron + neuron_counter++; + for(forward_list::iterator prev_layer_current_neuron(temp_prev_layer->begin()) ; prev_layer_current_neuron!=temp_prev_layer->end() ; ++prev_layer_current_neuron) + { + //current_neuron->set_nth_weight() + current_neuron->set_derror( current_neuron->get_derror()+prev_layer_current_neuron->get_derror()*prev_layer_current_neuron->get_nth_weight(neuron_counter) ); + } + } + } + } return true; } @@ -221,12 +269,14 @@ void Network::print() cout << (">> Output layer\n"); cout << "size : " << current_layer_size << endl; cout << ("neurons' activations : "); - for(forward_list::iterator it2(it1->begin()) ; it2!=it1->end() ; ++it2){cout << it2->get_activated_output() << " ";} + //for(forward_list::iterator it2(it1->begin()) ; it2!=it1->end() ; ++it2){cout << it2->get_activated_output() << " ";} + for(forward_list::iterator it2(it1->begin()) ; it2!=it1->end() ; ++it2){cout << it2->get_activated_output() << " " << it2->get_derror() << endl; for(int i=1;i<=3;i++){cout << it2->get_nth_weight(i) << " ";}cout<> Hidden layer " << layer_counter-1 << endl; cout << "size : " << current_layer_size << endl; + for(forward_list::iterator it2(it1->begin()) ; it2!=it1->end() ; ++it2){cout << it2->get_activated_output() << " " << it2->get_derror() << endl;}//to be deleted } cout << "------------------------------------------------" << endl; } diff --git a/myclasses.h b/myclasses.h index 223c77f..a34a196 100644 --- a/myclasses.h +++ b/myclasses.h @@ -21,6 +21,9 @@ public: float get_activated_output(); void set_derror(float value); float get_derror(); + void set_nth_weight(int n, float value); + float get_nth_weight(int n); + //std::forward_list &get_weights(); void activate(std::forward_list::iterator &prev_layer_it, Activ activ_function=LINEAR); private: std::forward_list weights;