From cb1f33c6ae840e8dc0f43518daf76e6ed01034f0 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Mon, 08 Dec 2014 19:48:57 +0000
Subject: [PATCH] Fixed race condition in server

---
 src/network.c |  149 +++++++++++++++++++++++++++++--------------------
 1 files changed, 89 insertions(+), 60 deletions(-)

diff --git a/src/network.c b/src/network.c
index 3761bf9..3a6a184 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1,4 +1,5 @@
 #include <stdio.h>
+#include <time.h>
 #include "network.h"
 #include "image.h"
 #include "data.h"
@@ -8,7 +9,9 @@
 #include "connected_layer.h"
 #include "convolutional_layer.h"
 #include "maxpool_layer.h"
+#include "cost_layer.h"
 #include "normalization_layer.h"
+#include "freeweight_layer.h"
 #include "softmax_layer.h"
 #include "dropout_layer.h"
 
@@ -22,54 +25,14 @@
     net.outputs = 0;
     net.output = 0;
     #ifdef GPU
-    net.input_cl = 0;
+    net.input_cl = calloc(1, sizeof(cl_mem));
+    net.truth_cl = calloc(1, sizeof(cl_mem));
     #endif
     return net;
 }
 
-#ifdef GPU
-void forward_network_gpu(network net, cl_mem input_cl, int train)
-{
-    int i;
-    for(i = 0; i < net.n; ++i){
-        if(net.types[i] == CONVOLUTIONAL){
-            convolutional_layer layer = *(convolutional_layer *)net.layers[i];
-            forward_convolutional_layer_gpu(layer, input_cl);
-            input_cl = layer.output_cl;
-        }
-        /*
-        else if(net.types[i] == CONNECTED){
-            connected_layer layer = *(connected_layer *)net.layers[i];
-            forward_connected_layer(layer, input, train);
-            input = layer.output;
-        }
-        else if(net.types[i] == SOFTMAX){
-            softmax_layer layer = *(softmax_layer *)net.layers[i];
-            forward_softmax_layer(layer, input);
-            input = layer.output;
-        }
-        else if(net.types[i] == CROP){
-            crop_layer layer = *(crop_layer *)net.layers[i];
-            forward_crop_layer(layer, input);
-            input = layer.output;
-        }
-        else if(net.types[i] == MAXPOOL){
-            maxpool_layer layer = *(maxpool_layer *)net.layers[i];
-            forward_maxpool_layer(layer, input);
-            input = layer.output;
-        }
-        else if(net.types[i] == NORMALIZATION){
-            normalization_layer layer = *(normalization_layer *)net.layers[i];
-            forward_normalization_layer(layer, input);
-            input = layer.output;
-        }
-        */
-    }
-}
 
-#endif
-
-void forward_network(network net, float *input, int train)
+void forward_network(network net, float *input, float *truth, int train)
 {
     int i;
     for(i = 0; i < net.n; ++i){
@@ -88,6 +51,10 @@
             forward_crop_layer(layer, input);
             input = layer.output;
         }
+        else if(net.types[i] == COST){
+            cost_layer layer = *(cost_layer *)net.layers[i];
+            forward_cost_layer(layer, input, truth);
+        }
         else if(net.types[i] == SOFTMAX){
             softmax_layer layer = *(softmax_layer *)net.layers[i];
             forward_softmax_layer(layer, input);
@@ -108,6 +75,11 @@
             dropout_layer layer = *(dropout_layer *)net.layers[i];
             forward_dropout_layer(layer, input);
         }
+        else if(net.types[i] == FREEWEIGHT){
+            if(!train) continue;
+            freeweight_layer layer = *(freeweight_layer *)net.layers[i];
+            forward_freeweight_layer(layer, input);
+        }
     }
 }
 
@@ -148,6 +120,8 @@
         return layer.output;
     } else if(net.types[i] == DROPOUT){
         return get_network_output_layer(net, i-1);
+    } else if(net.types[i] == FREEWEIGHT){
+        return get_network_output_layer(net, i-1);
     } else if(net.types[i] == CONNECTED){
         connected_layer layer = *(connected_layer *)net.layers[i];
         return layer.output;
@@ -159,7 +133,9 @@
 }
 float *get_network_output(network net)
 {
-    return get_network_output_layer(net, net.n-1);
+    int i;
+    for(i = net.n-1; i > 0; --i) if(net.types[i] != COST) break;
+    return get_network_output_layer(net, i);
 }
 
 float *get_network_delta_layer(network net, int i)
@@ -175,6 +151,8 @@
         return layer.delta;
     } else if(net.types[i] == DROPOUT){
         return get_network_delta_layer(net, i-1);
+    } else if(net.types[i] == FREEWEIGHT){
+        return get_network_delta_layer(net, i-1);
     } else if(net.types[i] == CONNECTED){
         connected_layer layer = *(connected_layer *)net.layers[i];
         return layer.delta;
@@ -182,6 +160,14 @@
     return 0;
 }
 
+float get_network_cost(network net)
+{
+    if(net.types[net.n-1] == COST){
+        return ((cost_layer *)net.layers[net.n-1])->output[0];
+    }
+    return 0;
+}
+
 float *get_network_delta(network net)
 {
     return get_network_delta_layer(net, net.n-1);
@@ -212,9 +198,8 @@
     return max_index(out, k);
 }
 
-float backward_network(network net, float *input, float *truth)
+void backward_network(network net, float *input)
 {
-    float error = calculate_error_network(net, truth);
     int i;
     float *prev_input;
     float *prev_delta;
@@ -228,11 +213,11 @@
         }
         if(net.types[i] == CONVOLUTIONAL){
             convolutional_layer layer = *(convolutional_layer *)net.layers[i];
-            backward_convolutional_layer(layer, prev_delta);
+            backward_convolutional_layer(layer, prev_input, prev_delta);
         }
         else if(net.types[i] == MAXPOOL){
             maxpool_layer layer = *(maxpool_layer *)net.layers[i];
-            if(i != 0) backward_maxpool_layer(layer, prev_input, prev_delta);
+            if(i != 0) backward_maxpool_layer(layer, prev_delta);
         }
         else if(net.types[i] == NORMALIZATION){
             normalization_layer layer = *(normalization_layer *)net.layers[i];
@@ -240,21 +225,28 @@
         }
         else if(net.types[i] == SOFTMAX){
             softmax_layer layer = *(softmax_layer *)net.layers[i];
-            if(i != 0) backward_softmax_layer(layer, prev_input, prev_delta);
+            if(i != 0) backward_softmax_layer(layer, prev_delta);
         }
         else if(net.types[i] == CONNECTED){
             connected_layer layer = *(connected_layer *)net.layers[i];
             backward_connected_layer(layer, prev_input, prev_delta);
         }
+        else if(net.types[i] == COST){
+            cost_layer layer = *(cost_layer *)net.layers[i];
+            backward_cost_layer(layer, prev_input, prev_delta);
+        }
     }
-    return error;
 }
 
+
+
+
 float train_network_datum(network net, float *x, float *y)
 {
-    forward_network(net, x, 1);
+    forward_network(net, x, y, 1);
     //int class = get_predicted_class_network(net);
-    float error = backward_network(net, x, y);
+    backward_network(net, x);
+    float error = get_network_cost(net);
     update_network(net);
     //return (y[class]?1:0);
     return error;
@@ -269,7 +261,7 @@
     int i;
     float sum = 0;
     for(i = 0; i < n; ++i){
-        get_batch(d, batch, X, y);
+        get_random_batch(d, batch, X, y);
         float err = train_network_datum(net, X, y);
         sum += err;
     }
@@ -277,6 +269,7 @@
     free(y);
     return (float)sum/(n*batch);
 }
+
 float train_network_batch(network net, data d, int n)
 {
     int i,j;
@@ -287,14 +280,32 @@
             int index = rand()%d.X.rows;
             float *x = d.X.vals[index];
             float *y = d.y.vals[index];
-            forward_network(net, x, 1);
-            sum += backward_network(net, x, y);
+            forward_network(net, x, y, 1);
+            backward_network(net, x);
+            sum += get_network_cost(net);
         }
         update_network(net);
     }
     return (float)sum/(n*batch);
 }
 
+float train_network_data_cpu(network net, data d, int n)
+{
+    int batch = net.batch;
+    float *X = calloc(batch*d.X.cols, sizeof(float));
+    float *y = calloc(batch*d.y.cols, sizeof(float));
+
+    int i;
+    float sum = 0;
+    for(i = 0; i < n; ++i){
+        get_next_batch(d, batch, i*batch, X, y);
+        float err = train_network_datum(net, X, y);
+        sum += err;
+    }
+    free(X);
+    free(y);
+    return (float)sum/(n*batch);
+}
 
 void train_network(network net, data d)
 {
@@ -329,6 +340,10 @@
         dropout_layer layer = *(dropout_layer *) net.layers[i];
         return layer.inputs;
     }
+    else if(net.types[i] == FREEWEIGHT){
+        freeweight_layer layer = *(freeweight_layer *) net.layers[i];
+        return layer.inputs;
+    }
     else if(net.types[i] == SOFTMAX){
         softmax_layer layer = *(softmax_layer *)net.layers[i];
         return layer.inputs;
@@ -351,10 +366,15 @@
     else if(net.types[i] == CONNECTED){
         connected_layer layer = *(connected_layer *)net.layers[i];
         return layer.outputs;
-    } else if(net.types[i] == DROPOUT){
+    }
+    else if(net.types[i] == DROPOUT){
         dropout_layer layer = *(dropout_layer *) net.layers[i];
         return layer.inputs;
     }
+    else if(net.types[i] == FREEWEIGHT){
+        freeweight_layer layer = *(freeweight_layer *) net.layers[i];
+        return layer.inputs;
+    }
     else if(net.types[i] == SOFTMAX){
         softmax_layer layer = *(softmax_layer *)net.layers[i];
         return layer.inputs;
@@ -396,7 +416,8 @@
 
 int get_network_output_size(network net)
 {
-    int i = net.n-1;
+    int i;
+    for(i = net.n-1; i > 0; --i) if(net.types[i] != COST) break;
     return get_network_output_size_layer(net, i);
 }
 
@@ -441,7 +462,7 @@
     image *prev = 0;
     int i;
     char buff[256];
-    show_image(get_network_image_layer(net, 0), "Crop");
+    //show_image(get_network_image_layer(net, 0), "Crop");
     for(i = 0; i < net.n; ++i){
         sprintf(buff, "Layer %d", i);
         if(net.types[i] == CONVOLUTIONAL){
@@ -455,9 +476,17 @@
     } 
 }
 
+void top_predictions(network net, int k, int *index)
+{
+    int size = get_network_output_size(net);
+    float *out = get_network_output(net);
+    top_k(out, size, k, index);
+}
+
+
 float *network_predict(network net, float *input)
 {
-    forward_network(net, input, 0);
+    forward_network(net, input, 0, 0);
     float *out = get_network_output(net);
     return out;
 }
@@ -492,7 +521,7 @@
     int i,j,b;
     int k = get_network_output_size(net);
     matrix pred = make_matrix(test.X.rows, k);
-    float *X = calloc(net.batch*test.X.rows, sizeof(float));
+    float *X = calloc(net.batch*test.X.cols, sizeof(float));
     for(i = 0; i < test.X.rows; i += net.batch){
         for(b = 0; b < net.batch; ++b){
             if(i+b == test.X.rows) break;

--
Gitblit v1.10.0