void resize_maxpool_layer(maxpool_layer *l, int w, int h) { int stride = l->stride; l->h = h; l->w = w; l->inputs = h*w*l->c; l->out_w = (w-1)/stride + 1; l->out_h = (h-1)/stride + 1; l->outputs = l->out_w * l->out_h * l->c; int output_size = l->outputs * l->batch; l->indexes = realloc(l->indexes, output_size * sizeof(int)); l->output = realloc(l->output, output_size * sizeof(float)); l->delta = realloc(l->delta, output_size * sizeof(float)); #ifdef GPU cuda_free((float *)l->indexes_gpu); cuda_free(l->output_gpu); cuda_free(l->delta_gpu); l->indexes_gpu = cuda_make_int_array(output_size); l->output_gpu = cuda_make_array(l->output, output_size); l->delta_gpu = cuda_make_array(l->delta, output_size); #endif }
maxpool_layer make_maxpool_layer(int batch, int h, int w, int c, int size, int stride, int padding) { maxpool_layer l = {}; l.type = MAXPOOL; l.batch = batch; l.h = h; l.w = w; l.c = c; l.pad = padding; l.out_w = (w + 2*padding)/stride; l.out_h = (h + 2*padding)/stride; l.out_c = c; l.outputs = l.out_h * l.out_w * l.out_c; l.inputs = h*w*c; l.size = size; l.stride = stride; int output_size = l.out_h * l.out_w * l.out_c * batch; l.indexes = (int*)calloc(output_size, sizeof(int)); l.output = (float*)calloc(output_size, sizeof(float)); l.delta = (float*)calloc(output_size, sizeof(float)); l.forward = forward_maxpool_layer; l.backward = backward_maxpool_layer; #ifdef GPU l.forward_gpu = forward_maxpool_layer_gpu; l.backward_gpu = backward_maxpool_layer_gpu; l.indexes_gpu = cuda_make_int_array(output_size); l.output_gpu = cuda_make_array(l.output, output_size); l.delta_gpu = cuda_make_array(l.delta, output_size); #endif fprintf(stderr, "max %d x %d / %d %4d x%4d x%4d -> %4d x%4d x%4d\n", size, size, stride, w, h, c, l.out_w, l.out_h, l.out_c); return l; }
maxpool_layer make_maxpool_layer_show(int batch, int h, int w, int c, int size, int stride, int show) { //fprintf(stderr, "Maxpool Layer: %d x %d x %d image, %d size, %d stride\n", h,w,c,size,stride); maxpool_layer l = { 0 }; l.type = MAXPOOL; l.batch = batch; l.h = h; l.w = w; l.c = c; l.out_w = (w - 1) / stride + 1; l.out_h = (h - 1) / stride + 1; l.out_c = c; l.outputs = l.out_h * l.out_w * l.out_c; l.inputs = h*w*c; l.size = size; l.stride = stride; int output_size = l.out_h * l.out_w * l.out_c * batch; l.indexes = calloc(output_size, sizeof(int)); l.output = calloc(output_size, sizeof(float)); l.delta = calloc(output_size, sizeof(float)); #ifdef GPU l.indexes_gpu = cuda_make_int_array(output_size); l.output_gpu = cuda_make_array(l.output, output_size); l.delta_gpu = cuda_make_array(l.delta, output_size); #endif if (show){ fprintf(stderr, "Maxpool Layer: %d x %d x %d image, %d size, %d stride -> %d x %d x %d image\n", h, w, c, size, stride, l.out_h, l.out_w, l.out_c); } return l; }
layer make_compact_layer(int batch, int splits, int method, int w, int h, int c) { fprintf(stderr,"Compact Layer: Split and merge channels in %d groups. %d %d %d\n", splits,w ,h ,c); layer l = {0}; l.type = COMPACT; l.batch = batch; l.w = w; l.h = h; l.c = c; l.out_w = w; l.out_h = h; if (method<10) { l.out_c = c/splits; } else { l.out_c = c; } l.outputs = l.out_w * l.out_h * l.out_c; l.inputs = w*h*c; l.index = splits; l.method = method; l.delta = calloc(l.outputs*batch, sizeof(float)); l.output = calloc(l.outputs*batch, sizeof(float));; l.indexes = calloc(l.outputs*batch, sizeof(int)); #ifdef GPU l.delta_gpu = cuda_make_array(l.delta, l.outputs*batch); l.output_gpu = cuda_make_array(l.output, l.outputs*batch); l.indexes_gpu = cuda_make_int_array(l.outputs*batch); #endif return l; }