From ad9dbfe16495204453b1b7f8593d320751f76ca0 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Tue, 10 Dec 2013 18:30:42 +0000
Subject: [PATCH] CSE546 submission

---
 src/convolutional_layer.c |   30 ++++++++++++------------------
 1 files changed, 12 insertions(+), 18 deletions(-)

diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c
index 6d77700..ef48120 100644
--- a/src/convolutional_layer.c
+++ b/src/convolutional_layer.c
@@ -47,10 +47,10 @@
     layer->biases = calloc(n, sizeof(double));
     layer->bias_updates = calloc(n, sizeof(double));
     layer->bias_momentum = calloc(n, sizeof(double));
-    double scale = 20./(size*size*c);
+    double scale = 2./(size*size);
     for(i = 0; i < n; ++i){
         //layer->biases[i] = rand_normal()*scale + scale;
-        layer->biases[i] = 1;
+        layer->biases[i] = 0;
         layer->kernels[i] = make_random_kernel(size, c, scale);
         layer->kernel_updates[i] = make_random_kernel(size, c, 0);
         layer->kernel_momentum[i] = make_random_kernel(size, c, 0);
@@ -63,7 +63,7 @@
         out_h = (layer->h - layer->size)/layer->stride+1;
         out_w = (layer->h - layer->size)/layer->stride+1;
     }
-    printf("Convolutional Layer: %d x %d x %d image, %d filters -> %d x %d x %d image\n", h,w,c,n, out_h, out_w, n);
+    fprintf(stderr, "Convolutional Layer: %d x %d x %d image, %d filters -> %d x %d x %d image\n", h,w,c,n, out_h, out_w, n);
     layer->output = calloc(out_h * out_w * n, sizeof(double));
     layer->delta  = calloc(out_h * out_w * n, sizeof(double));
     layer->upsampled = make_image(h,w,n);
@@ -124,38 +124,41 @@
     }
 }
 
-void learn_convolutional_layer(convolutional_layer layer, double *input)
+void gradient_delta_convolutional_layer(convolutional_layer layer)
 {
     int i;
-    image in_image = double_to_image(layer.h, layer.w, layer.c, input);
     image out_delta = get_convolutional_delta(layer);
     image out_image = get_convolutional_image(layer);
     for(i = 0; i < out_image.h*out_image.w*out_image.c; ++i){
         out_delta.data[i] *= gradient(out_image.data[i], layer.activation);
     }
+}
+
+void learn_convolutional_layer(convolutional_layer layer, double *input)
+{
+    int i;
+    image in_image = double_to_image(layer.h, layer.w, layer.c, input);
+    image out_delta = get_convolutional_delta(layer);
+    gradient_delta_convolutional_layer(layer);
     for(i = 0; i < layer.n; ++i){
         kernel_update(in_image, layer.kernel_updates[i], layer.stride, i, out_delta, layer.edge);
         layer.bias_updates[i] += avg_image_layer(out_delta, i);
-        //printf("%30.20lf\n", layer.bias_updates[i]);
     }
 }
 
 void update_convolutional_layer(convolutional_layer layer, double step, double momentum, double decay)
 {
-    //step = .01;
     int i,j;
     for(i = 0; i < layer.n; ++i){
         layer.bias_momentum[i] = step*(layer.bias_updates[i]) 
                                 + momentum*layer.bias_momentum[i];
         layer.biases[i] += layer.bias_momentum[i];
-        //layer.biases[i] = constrain(layer.biases[i],1.);
         layer.bias_updates[i] = 0;
         int pixels = layer.kernels[i].h*layer.kernels[i].w*layer.kernels[i].c;
         for(j = 0; j < pixels; ++j){
             layer.kernel_momentum[i].data[j] = step*(layer.kernel_updates[i].data[j] - decay*layer.kernels[i].data[j]) 
                                                 + momentum*layer.kernel_momentum[i].data[j];
             layer.kernels[i].data[j] += layer.kernel_momentum[i].data[j];
-            //layer.kernels[i].data[j] = constrain(layer.kernels[i].data[j], 1.);
         }
         zero_image(layer.kernel_updates[i]);
     }
@@ -181,14 +184,6 @@
         int w_offset = i*(size+border);
         image k = layer.kernels[i];
         image copy = copy_image(k);
-        /*
-        printf("Kernel %d - Bias: %f, Channels:",i,layer.biases[i]);
-        for(j = 0; j < k.c; ++j){
-            double a = avg_image_layer(k, j);
-            printf("%f, ", a);
-        }
-        printf("\n");
-        */
         normalize_image(copy);
         for(j = 0; j < k.c; ++j){
             set_pixel(copy,0,0,j,layer.biases[i]);
@@ -220,7 +215,6 @@
 {
     int i;
     char buff[256];
-    //image vis = make_image(layer.n*layer.size, layer.size*layer.kernels[0].c, 3);
     for(i = 0; i < layer.n; ++i){
         image k = layer.kernels[i];
         sprintf(buff, "Kernel %d", i);

--
Gitblit v1.10.0