From 8c3694bc911bbeab63e75c18f920e0991a5fa877 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Sat, 07 Dec 2013 17:38:50 +0000
Subject: [PATCH] Ensemble
---
src/convolutional_layer.c | 32 +++++++++++++-------------------
1 files changed, 13 insertions(+), 19 deletions(-)
diff --git a/src/convolutional_layer.c b/src/convolutional_layer.c
index 6d77700..5accaab 100644
--- a/src/convolutional_layer.c
+++ b/src/convolutional_layer.c
@@ -39,7 +39,7 @@
layer->w = w;
layer->c = c;
layer->n = n;
- layer->edge = 0;
+ layer->edge = 1;
layer->stride = stride;
layer->kernels = calloc(n, sizeof(image));
layer->kernel_updates = calloc(n, sizeof(image));
@@ -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