Joseph Redmon
2013-12-10 ad9dbfe16495204453b1b7f8593d320751f76ca0
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);