NN: Make base layer fields accessible from sub layers.

This commit is contained in:
iabdalkader 2018-05-22 16:30:46 +02:00
parent fce3b9476a
commit d967ad62cd
2 changed files with 27 additions and 24 deletions

View File

@ -165,14 +165,14 @@ int nn_load_network(nn_t *net, const char *path)
// Alloc and read weights array // Alloc and read weights array
read_data(&fp, &conv_layer->w_size, 4); read_data(&fp, &conv_layer->w_size, 4);
printf("weights: %lu ", conv_layer->w_size); printf("weights: %lu ", conv_layer->w_size);
conv_layer->w = xalloc(conv_layer->w_size); conv_layer->wt = xalloc(conv_layer->w_size);
read_data(&fp, conv_layer->w, conv_layer->w_size); read_data(&fp, conv_layer->wt, conv_layer->w_size);
// Alloc and read bias array // Alloc and read bias array
read_data(&fp, &conv_layer->b_size, 4); read_data(&fp, &conv_layer->b_size, 4);
printf("bias: %lu\n", conv_layer->b_size); printf("bias: %lu\n", conv_layer->b_size);
conv_layer->b = xalloc(conv_layer->b_size); conv_layer->bias = xalloc(conv_layer->b_size);
read_data(&fp, conv_layer->b, conv_layer->b_size); read_data(&fp, conv_layer->bias, conv_layer->b_size);
break; break;
} }
@ -185,7 +185,7 @@ int nn_load_network(nn_t *net, const char *path)
case LAYER_TYPE_POOL: { case LAYER_TYPE_POOL: {
pool_layer_t *pool_layer = (pool_layer_t *) layer; pool_layer_t *pool_layer = (pool_layer_t *) layer;
// Read pooling layer type // Read pooling layer type
read_data(&fp, &pool_layer->type, 4); read_data(&fp, &pool_layer->ptype, 4);
// Read krnel dim, stride and padding // Read krnel dim, stride and padding
read_data(&fp, &pool_layer->krn_dim, 4); read_data(&fp, &pool_layer->krn_dim, 4);
read_data(&fp, &pool_layer->krn_str, 4); read_data(&fp, &pool_layer->krn_str, 4);
@ -206,14 +206,14 @@ int nn_load_network(nn_t *net, const char *path)
// Alloc and read weights array // Alloc and read weights array
read_data(&fp, &ip_layer->w_size, 4); read_data(&fp, &ip_layer->w_size, 4);
printf("weights: %lu ", ip_layer->w_size); printf("weights: %lu ", ip_layer->w_size);
ip_layer->w = xalloc(ip_layer->w_size); ip_layer->wt = xalloc(ip_layer->w_size);
read_data(&fp, ip_layer->w, ip_layer->w_size); read_data(&fp, ip_layer->wt, ip_layer->w_size);
// Alloc and read bias array // Alloc and read bias array
read_data(&fp, &ip_layer->b_size, 4); read_data(&fp, &ip_layer->b_size, 4);
printf("bias %lu\n", ip_layer->b_size); printf("bias %lu\n", ip_layer->b_size);
ip_layer->b = xalloc(ip_layer->b_size); ip_layer->bias = xalloc(ip_layer->b_size);
read_data(&fp, ip_layer->b, ip_layer->b_size); read_data(&fp, ip_layer->bias, ip_layer->b_size);
break; break;
} }
} }
@ -234,7 +234,7 @@ int nn_load_network(nn_t *net, const char *path)
if (layer->type == LAYER_TYPE_CONV) { if (layer->type == LAYER_TYPE_CONV) {
conv_layer_t *conv_layer = (conv_layer_t *) layer; conv_layer_t *conv_layer = (conv_layer_t *) layer;
uint32_t im2col_buffer_size = 2 * 2 * layer->c * conv_layer->krn_dim * conv_layer->krn_dim; uint32_t im2col_buffer_size = 2 * 2 * conv_layer->c * conv_layer->krn_dim * conv_layer->krn_dim;
max_colbuf_size = IM_MAX(max_colbuf_size, im2col_buffer_size); max_colbuf_size = IM_MAX(max_colbuf_size, im2col_buffer_size);
} }
@ -269,7 +269,7 @@ error:
return res; return res;
} }
int nn_run_network(nn_t *net, image_t *image) int nn_run_network(nn_t *net, image_t *img, int8_t *output)
{ {
return 0; return 0;
} }

View File

@ -26,22 +26,25 @@ typedef enum {
NETWORK_TYPE_CAFFE = 0, NETWORK_TYPE_CAFFE = 0,
} network_type_t; } network_type_t;
#define NN_LAYER_BASE \
layer_type_t type; \
uint32_t c, h, w; \
struct _layer *prev;\
struct _layer *next \
typedef struct _layer { typedef struct _layer {
layer_type_t type; NN_LAYER_BASE;
uint32_t c, h, w;
struct _layer *prev;
struct _layer *next;
} layer_t; } layer_t;
typedef struct { typedef struct {
layer_t base; NN_LAYER_BASE;
uint32_t r_mean; uint32_t r_mean;
uint32_t g_mean; uint32_t g_mean;
uint32_t b_mean; uint32_t b_mean;
} data_layer_t; } data_layer_t;
typedef struct { typedef struct {
layer_t base; NN_LAYER_BASE;
uint32_t l_shift; uint32_t l_shift;
uint32_t r_shift; uint32_t r_shift;
uint32_t krn_dim; uint32_t krn_dim;
@ -49,28 +52,28 @@ typedef struct {
uint32_t krn_pad; uint32_t krn_pad;
uint32_t w_size; uint32_t w_size;
uint32_t b_size; uint32_t b_size;
int8_t *w, *b; int8_t *wt, *bias;
} conv_layer_t; } conv_layer_t;
typedef struct { typedef struct {
layer_t base; NN_LAYER_BASE;
} relu_layer_t; } relu_layer_t;
typedef struct { typedef struct {
layer_t base; NN_LAYER_BASE;
pool_type_t type; pool_type_t ptype;
uint32_t krn_dim; uint32_t krn_dim;
uint32_t krn_str; uint32_t krn_str;
uint32_t krn_pad; uint32_t krn_pad;
} pool_layer_t; } pool_layer_t;
typedef struct { typedef struct {
layer_t base; NN_LAYER_BASE;
uint32_t l_shift; uint32_t l_shift;
uint32_t r_shift; uint32_t r_shift;
uint32_t w_size; uint32_t w_size;
uint32_t b_size; uint32_t b_size;
int8_t *w, *b; int8_t *wt, *bias;
} ip_layer_t; } ip_layer_t;
typedef struct { typedef struct {
@ -84,5 +87,5 @@ typedef struct {
int nn_dump_network(nn_t *net); int nn_dump_network(nn_t *net);
int nn_load_network(nn_t *net, const char *path); int nn_load_network(nn_t *net, const char *path);
int nn_run_network(nn_t *net, image_t *image); int nn_run_network(nn_t *net, image_t *img, int8_t *output);
#endif //#define __CNN_H__ #endif //#define __CNN_H__