From 08b757a0bf76efe8c76b453063a1bb19315bcaa6 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Wed, 14 Jan 2015 20:18:57 +0000
Subject: [PATCH] Stable, needs to be way faster

---
 src/network.c |   64 +++++++++++++++++++++++++++++++
 1 files changed, 63 insertions(+), 1 deletions(-)

diff --git a/src/network.c b/src/network.c
index 829bb6e..641d782 100644
--- a/src/network.c
+++ b/src/network.c
@@ -15,6 +15,35 @@
 #include "softmax_layer.h"
 #include "dropout_layer.h"
 
+char *get_layer_string(LAYER_TYPE a)
+{
+    switch(a){
+        case CONVOLUTIONAL:
+            return "convolutional";
+        case CONNECTED:
+            return "connected";
+        case MAXPOOL:
+            return "maxpool";
+        case SOFTMAX:
+            return "softmax";
+        case NORMALIZATION:
+            return "normalization";
+        case DROPOUT:
+            return "dropout";
+        case FREEWEIGHT:
+            return "freeweight";
+        case CROP:
+            return "crop";
+        case COST:
+            return "cost";
+        default:
+            break;
+    }
+    return "none";
+}
+
+
+
 network make_network(int n, int batch)
 {
     network net;
@@ -74,6 +103,7 @@
             if(!train) continue;
             dropout_layer layer = *(dropout_layer *)net.layers[i];
             forward_dropout_layer(layer, input);
+            input = layer.output;
         }
         else if(net.types[i] == FREEWEIGHT){
             if(!train) continue;
@@ -102,6 +132,7 @@
         }
         else if(net.types[i] == CONNECTED){
             connected_layer layer = *(connected_layer *)net.layers[i];
+            //secret_update_connected_layer((connected_layer *)net.layers[i]);
             update_connected_layer(layer);
         }
     }
@@ -119,7 +150,8 @@
         softmax_layer layer = *(softmax_layer *)net.layers[i];
         return layer.output;
     } else if(net.types[i] == DROPOUT){
-        return get_network_output_layer(net, i-1);
+        dropout_layer layer = *(dropout_layer *)net.layers[i];
+        return layer.output;
     } else if(net.types[i] == FREEWEIGHT){
         return get_network_output_layer(net, i-1);
     } else if(net.types[i] == CONNECTED){
@@ -153,6 +185,7 @@
         softmax_layer layer = *(softmax_layer *)net.layers[i];
         return layer.delta;
     } else if(net.types[i] == DROPOUT){
+        if(i == 0) return 0;
         return get_network_delta_layer(net, i-1);
     } else if(net.types[i] == FREEWEIGHT){
         return get_network_delta_layer(net, i-1);
@@ -368,6 +401,10 @@
             cost_layer *layer = (cost_layer *)net->layers[i];
             layer->batch = b;
         }
+        else if(net->types[i] == CROP){
+            crop_layer *layer = (crop_layer *)net->layers[i];
+            layer->batch = b;
+        }
     }
 }
 
@@ -645,6 +682,31 @@
     }
 }
 
+void compare_networks(network n1, network n2, data test)
+{
+    matrix g1 = network_predict_data(n1, test);
+    matrix g2 = network_predict_data(n2, test);
+    int i;
+    int a,b,c,d;
+    a = b = c = d = 0;
+    for(i = 0; i < g1.rows; ++i){
+        int truth = max_index(test.y.vals[i], test.y.cols);
+        int p1 = max_index(g1.vals[i], g1.cols);
+        int p2 = max_index(g2.vals[i], g2.cols);
+        if(p1 == truth){
+            if(p2 == truth) ++d;
+            else ++c;
+        }else{
+            if(p2 == truth) ++b;
+            else ++a;
+        }
+    }
+    printf("%5d %5d\n%5d %5d\n", a, b, c, d);
+    float num = pow((abs(b - c) - 1.), 2.);
+    float den = b + c;
+    printf("%f\n", num/den); 
+}
+
 float network_accuracy(network net, data d)
 {
     matrix guess = network_predict_data(net, d);

--
Gitblit v1.10.0