From 0e610b056dbcd85affa23f64f9f8da4d197f110a Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Thu, 08 Sep 2016 05:46:10 +0000
Subject: [PATCH] and again

---
 src/network.c |   44 ++++++++++++++++++++++++++++++++++----------
 1 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/src/network.c b/src/network.c
index 2960d67..c9a198f 100644
--- a/src/network.c
+++ b/src/network.c
@@ -16,9 +16,11 @@
 #include "activation_layer.h"
 #include "deconvolutional_layer.h"
 #include "detection_layer.h"
+#include "region_layer.h"
 #include "normalization_layer.h"
 #include "batchnorm_layer.h"
 #include "maxpool_layer.h"
+#include "reorg_layer.h"
 #include "avgpool_layer.h"
 #include "cost_layer.h"
 #include "softmax_layer.h"
@@ -64,6 +66,7 @@
         case EXP:
             return net.learning_rate * pow(net.gamma, batch_num);
         case POLY:
+            if (batch_num < net.burn_in) return net.learning_rate * pow((float)batch_num / net.burn_in, net.power);
             return net.learning_rate * pow(1 - (float)batch_num / net.max_batches, net.power);
         case RANDOM:
             return net.learning_rate * pow(rand_uniform(0,1), net.power);
@@ -96,12 +99,16 @@
             return "crnn";
         case MAXPOOL:
             return "maxpool";
+        case REORG:
+            return "reorg";
         case AVGPOOL:
             return "avgpool";
         case SOFTMAX:
             return "softmax";
         case DETECTION:
             return "detection";
+        case REGION:
+            return "region";
         case DROPOUT:
             return "dropout";
         case CROP:
@@ -159,6 +166,8 @@
             forward_batchnorm_layer(l, state);
         } else if(l.type == DETECTION){
             forward_detection_layer(l, state);
+        } else if(l.type == REGION){
+            forward_region_layer(l, state);
         } else if(l.type == CONNECTED){
             forward_connected_layer(l, state);
         } else if(l.type == RNN){
@@ -175,6 +184,8 @@
             forward_softmax_layer(l, state);
         } else if(l.type == MAXPOOL){
             forward_maxpool_layer(l, state);
+        } else if(l.type == REORG){
+            forward_reorg_layer(l, state);
         } else if(l.type == AVGPOOL){
             forward_avgpool_layer(l, state);
         } else if(l.type == DROPOUT){
@@ -216,7 +227,7 @@
 float *get_network_output(network net)
 {
     #ifdef GPU
-        return get_network_output_gpu(net);
+        if (gpu_index >= 0) return get_network_output_gpu(net);
     #endif 
     int i;
     for(i = net.n-1; i > 0; --i) if(net.layers[i].type != COST) break;
@@ -229,11 +240,7 @@
     float sum = 0;
     int count = 0;
     for(i = 0; i < net.n; ++i){
-        if(net.layers[i].type == COST){
-            sum += net.layers[i].cost[0];
-            ++count;
-        }
-        if(net.layers[i].type == DETECTION){
+        if(net.layers[i].cost){
             sum += net.layers[i].cost[0];
             ++count;
         }
@@ -277,12 +284,16 @@
             backward_batchnorm_layer(l, state);
         } else if(l.type == MAXPOOL){
             if(i != 0) backward_maxpool_layer(l, state);
+        } else if(l.type == REORG){
+            backward_reorg_layer(l, state);
         } else if(l.type == AVGPOOL){
             backward_avgpool_layer(l, state);
         } else if(l.type == DROPOUT){
             backward_dropout_layer(l, state);
         } else if(l.type == DETECTION){
             backward_detection_layer(l, state);
+        } else if(l.type == REGION){
+            backward_region_layer(l, state);
         } else if(l.type == SOFTMAX){
             if(i != 0) backward_softmax_layer(l, state);
         } else if(l.type == CONNECTED){
@@ -362,6 +373,7 @@
     return (float)sum/(n*batch);
 }
 
+
 float train_network_batch(network net, data d, int n)
 {
     int i,j;
@@ -392,6 +404,11 @@
     int i;
     for(i = 0; i < net->n; ++i){
         net->layers[i].batch = b;
+        #ifdef CUDNN
+        if(net->layers[i].type == CONVOLUTIONAL){
+            cudnn_convolutional_setup(net->layers + i);
+        }
+        #endif
     }
 }
 
@@ -403,7 +420,7 @@
     net->h = h;
     int inputs = 0;
     size_t workspace_size = 0;
-    //fprintf(stderr, "Resizing to %d x %d...", w, h);
+    //fprintf(stderr, "Resizing to %d x %d...\n", w, h);
     //fflush(stderr);
     for (i = 0; i < net->n; ++i){
         layer l = net->layers[i];
@@ -413,6 +430,8 @@
             resize_crop_layer(&l, w, h);
         }else if(l.type == MAXPOOL){
             resize_maxpool_layer(&l, w, h);
+        }else if(l.type == REORG){
+            resize_reorg_layer(&l, w, h);
         }else if(l.type == AVGPOOL){
             resize_avgpool_layer(&l, w, h);
         }else if(l.type == NORMALIZATION){
@@ -430,11 +449,16 @@
         if(l.type == AVGPOOL) break;
     }
 #ifdef GPU
+    if(gpu_index >= 0){
         cuda_free(net->workspace);
         net->workspace = cuda_make_array(0, (workspace_size-1)/sizeof(float)+1);
-#else
+    }else {
         free(net->workspace);
         net->workspace = calloc(1, workspace_size);
+    }
+#else
+    free(net->workspace);
+    net->workspace = calloc(1, workspace_size);
 #endif
     //fprintf(stderr, " Done!\n");
     return 0;
@@ -650,10 +674,10 @@
         free_layer(net.layers[i]);
     }
     free(net.layers);
-    #ifdef GPU
+#ifdef GPU
     if(*net.input_gpu) cuda_free(*net.input_gpu);
     if(*net.truth_gpu) cuda_free(*net.truth_gpu);
     if(net.input_gpu) free(net.input_gpu);
     if(net.truth_gpu) free(net.truth_gpu);
-    #endif
+#endif
 }

--
Gitblit v1.10.0