Joseph Redmon
2015-05-06 e7688a05a194e3c8baf3c11fbf09b7f5e8640a77
src/deconvolutional_layer.c
@@ -31,7 +31,7 @@
    h = deconvolutional_out_height(layer);
    w = deconvolutional_out_width(layer);
    c = layer.n;
    return float_to_image(h,w,c,layer.output);
    return float_to_image(w,h,c,layer.output);
}
image get_deconvolutional_delta(deconvolutional_layer layer)
@@ -40,18 +40,14 @@
    h = deconvolutional_out_height(layer);
    w = deconvolutional_out_width(layer);
    c = layer.n;
    return float_to_image(h,w,c,layer.delta);
    return float_to_image(w,h,c,layer.delta);
}
deconvolutional_layer *make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, ACTIVATION activation, float learning_rate, float momentum, float decay)
deconvolutional_layer *make_deconvolutional_layer(int batch, int h, int w, int c, int n, int size, int stride, ACTIVATION activation)
{
    int i;
    deconvolutional_layer *layer = calloc(1, sizeof(deconvolutional_layer));
    layer->learning_rate = learning_rate;
    layer->momentum = momentum;
    layer->decay = decay;
    layer->h = h;
    layer->w = w;
    layer->c = c;
@@ -120,7 +116,7 @@
    #endif
}
void forward_deconvolutional_layer(const deconvolutional_layer layer, float *in)
void forward_deconvolutional_layer(const deconvolutional_layer layer, network_state state)
{
    int i;
    int out_h = deconvolutional_out_height(layer);
@@ -135,7 +131,7 @@
    for(i = 0; i < layer.batch; ++i){
        float *a = layer.filters;
        float *b = in + i*layer.c*layer.h*layer.w;
        float *b = state.input + i*layer.c*layer.h*layer.w;
        float *c = layer.col_image;
        gemm(1,0,m,n,k,1,a,m,b,n,0,c,n);
@@ -145,7 +141,7 @@
    activate_array(layer.output, layer.batch*layer.n*size, layer.activation);
}
void backward_deconvolutional_layer(deconvolutional_layer layer, float *in, float *delta)
void backward_deconvolutional_layer(deconvolutional_layer layer, network_state state)
{
    float alpha = 1./layer.batch;
    int out_h = deconvolutional_out_height(layer);
@@ -156,14 +152,14 @@
    gradient_array(layer.output, size*layer.n*layer.batch, layer.activation, layer.delta);
    backward_bias(layer.bias_updates, layer.delta, layer.batch, layer.n, size);
    if(delta) memset(delta, 0, layer.batch*layer.h*layer.w*layer.c*sizeof(float));
    if(state.delta) memset(state.delta, 0, layer.batch*layer.h*layer.w*layer.c*sizeof(float));
    for(i = 0; i < layer.batch; ++i){
        int m = layer.c;
        int n = layer.size*layer.size*layer.n;
        int k = layer.h*layer.w;
        float *a = in + i*m*n;
        float *a = state.input + i*m*n;
        float *b = layer.col_image;
        float *c = layer.filter_updates;
@@ -171,29 +167,29 @@
                layer.size, layer.stride, 0, b);
        gemm(0,1,m,n,k,alpha,a,k,b,k,1,c,n);
        if(delta){
        if(state.delta){
            int m = layer.c;
            int n = layer.h*layer.w;
            int k = layer.size*layer.size*layer.n;
            float *a = layer.filters;
            float *b = layer.col_image;
            float *c = delta + i*n*m;
            float *c = state.delta + i*n*m;
            gemm(0,0,m,n,k,1,a,k,b,n,1,c,n);
        }
    }
}
void update_deconvolutional_layer(deconvolutional_layer layer)
void update_deconvolutional_layer(deconvolutional_layer layer, float learning_rate, float momentum, float decay)
{
    int size = layer.size*layer.size*layer.c*layer.n;
    axpy_cpu(layer.n, layer.learning_rate, layer.bias_updates, 1, layer.biases, 1);
    scal_cpu(layer.n, layer.momentum, layer.bias_updates, 1);
    axpy_cpu(layer.n, learning_rate, layer.bias_updates, 1, layer.biases, 1);
    scal_cpu(layer.n, momentum, layer.bias_updates, 1);
    axpy_cpu(size, -layer.decay, layer.filters, 1, layer.filter_updates, 1);
    axpy_cpu(size, layer.learning_rate, layer.filter_updates, 1, layer.filters, 1);
    scal_cpu(size, layer.momentum, layer.filter_updates, 1);
    axpy_cpu(size, -decay, layer.filters, 1, layer.filter_updates, 1);
    axpy_cpu(size, learning_rate, layer.filter_updates, 1, layer.filters, 1);
    scal_cpu(size, momentum, layer.filter_updates, 1);
}