diff --git a/ML/NN/NN.cpp b/ML/NN/NN.cpp
index cc7e1aeed488c4648d2fa7e68a534befb07ee568..cbd0f0e297f9162afbf8afe55a1e6e9e508b3af4 100644
--- a/ML/NN/NN.cpp
+++ b/ML/NN/NN.cpp
@@ -24,10 +24,9 @@ NN::NN(double alpha, int epochs, int batchSize, float th, DatasetReader *dt, str
     this->mainpath = mainpath;
 
 
-
+    network.resize(3);
     // initialize the weights of the newtork
 
-
     for(int i=1; i < network.size()+1; i++)
     {
 
@@ -35,7 +34,7 @@ NN::NN(double alpha, int epochs, int batchSize, float th, DatasetReader *dt, str
         {
             vector<float> weights;
             for (int k=0; k < network_dimensions[i-1]+1; k++)
-                weights.push_back(0.0);
+                weights.push_back(0.0); // je compte le biais
 
             neuron *n = new neuron(weights, alpha,epochs, batchSize, th, dt,debug);
             network[i-1].push_back(n);
@@ -58,23 +57,52 @@ NN::NN(double alpha, int epochs, int batchSize, float th, DatasetReader *dt, str
 }
 
 
-vector<vector<float>> NN::forward_layer(vector<neuron*> layer, vector<vector<float>> x, bool test ){
+vector<vector<float>> NN::forward_layer(vector<neuron*> layer, vector<vector<float>> x, bool test, bool first ){
+
 
     vector<vector<float>> res;
+    if(!first)
+    {
+        for (int i=0; i<x.size(); i++)
+        {
+           x[i].insert(x[i].begin(), 1);
+        }
+    }
+
+
     for (int j=0; j < layer.size(); j++)
     {
         neuron *n = layer[j];
+
         res.push_back(n->predict_batch(x,test));
     }
 
-    return  res;
+    //todo : add an additional step to invert: batch_layes
+
+
+    vector<vector<float>> res_final(x.size(), vector<float > (layer.size(),0.0));
+
+
+    for (int i=0; i<x.size(); i++)
+    {
+
+        for (int k=0; k< layer.size(); k++)
+        {
+            float e = res[k][i];
+            res_final[i][k] = e;
+
+        }
+    }
+
+    return  res_final;
 
 }
 
 
 vector<int> NN::predict(vector<Record *>R, bool test ) {
 
-
+    // todo: edit so that the final output is only a class label and make sure itrs the same thing as ytrue
+    bool first = true;
     vector<vector<float>> XB;
     for (int i=0; i < R.size(); i++)
     {
@@ -85,7 +113,9 @@ vector<int> NN::predict(vector<Record *>R, bool test ) {
 
     for (int i=0; i < network.size(); i++)
     {
-        XB = forward_layer(network[i], XB, test );
+
+        XB = forward_layer(network[i], XB, test, first);
+        first =  false;
     }
 
 
@@ -135,20 +165,28 @@ void NN::backpropagate(vector<Record *> XB){
 
     vector<int> prediction = predict(XB, false);
     vector<vector<float>> R;
-    vector<vector<float>>ytrue;
+    vector<vector<float>> ytrue(2, vector<float>(XB.size(),0));
     int dim = XB[0]->values.size()-1;
-    for(int i=0; i<XB.size(); i++)
-    {
+    int numberClasses = 2;
+
+        for(int i=0; i<XB.size(); i++)
+        {
+            //todo: try to understand why is there a double amount of values per class in ytrue
+            vector<float> r =  vector<float> (XB[i]->values.begin(), XB[i]->values.end());
+            r.pop_back();
+            R.push_back(r);
+            std::vector<float> hot_label(2); // hard coded the number of classes
+            for (int s=0; s<numberClasses; s++) {
+                    if(s!= XB[i]->values[dim])
+                        ytrue[s].push_back(0);
+                    else
+                        ytrue[s].push_back(1);
+            }
+
+        }
+
 
-        vector<float> r =  vector<float> (XB[i]->values.begin(), XB[i]->values.end());
-        r.pop_back();
-        R.push_back(r);
-        std::vector<float> hot_label(2); // hard coded the number of classes
-        hot_label[XB[i]->values[dim]] =1 ;
-        hot_label[1-XB[i]->values[dim]] =0;
-        ytrue.push_back(hot_label);
 
-    }
 
 
 
diff --git a/ML/NN/NN.h b/ML/NN/NN.h
index 9ef4ceb35b6d06fbeda37d9149fbcffdc3ffb053..4d8f753faefc18e2770b52bc4a7e5719b5823054 100644
--- a/ML/NN/NN.h
+++ b/ML/NN/NN.h
@@ -25,6 +25,7 @@ public :
     double alpha;
     int batchSize;
     vector<vector<neuron*>> network;
+
     vector<int> network_dimensions = {14,12,6,2};
 
     float th;
@@ -60,7 +61,7 @@ public :
     void backpropagate(vector<Record *> XB);
 
 public :
-    vector<vector<float>> forward_layer(vector<neuron*> layer, vector<vector<float>> x, bool test );
+    vector<vector<float>> forward_layer(vector<neuron*> layer, vector<vector<float>> x, bool test, bool first = false);
 
 public :
     void train ();
diff --git a/ML/NN/neuron.cpp b/ML/NN/neuron.cpp
index ba45c6b6b597f6d523d6463f4c6a90d19edfb9d6..a1ddf1710250e8e905813845217c148f3721de26 100644
--- a/ML/NN/neuron.cpp
+++ b/ML/NN/neuron.cpp
@@ -94,8 +94,8 @@ vector<float> neuron::miniBatchGrad( vector<float> ypred,   vector<float> ytrue
     vector <float > diff;
     vector <float> r;
     float inter = 0.0;
-    int dim = this->previous_input.size();
-    vector<vector<float>> XB;
+    int dim = this->previous_input[0].size();
+    vector<vector<float>> XB = this->previous_input;
     // Compute XB transpose
     float transpose [dim] [XB.size()];