From d967ad62cd7a1a6602ec9e5f48e3c51c98c91b19 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Tue, 22 May 2018 16:30:46 +0200 Subject: [PATCH] NN: Make base layer fields accessible from sub layers. --- src/omv/nn/nn.c | 22 +++++++++++----------- src/omv/nn/nn.h | 29 ++++++++++++++++------------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/omv/nn/nn.c b/src/omv/nn/nn.c index ad71b9748..bcf74dcf4 100644 --- a/src/omv/nn/nn.c +++ b/src/omv/nn/nn.c @@ -165,14 +165,14 @@ int nn_load_network(nn_t *net, const char *path) // Alloc and read weights array read_data(&fp, &conv_layer->w_size, 4); printf("weights: %lu ", conv_layer->w_size); - conv_layer->w = xalloc(conv_layer->w_size); - read_data(&fp, conv_layer->w, conv_layer->w_size); + conv_layer->wt = xalloc(conv_layer->w_size); + read_data(&fp, conv_layer->wt, conv_layer->w_size); // Alloc and read bias array read_data(&fp, &conv_layer->b_size, 4); printf("bias: %lu\n", conv_layer->b_size); - conv_layer->b = xalloc(conv_layer->b_size); - read_data(&fp, conv_layer->b, conv_layer->b_size); + conv_layer->bias = xalloc(conv_layer->b_size); + read_data(&fp, conv_layer->bias, conv_layer->b_size); break; } @@ -185,7 +185,7 @@ int nn_load_network(nn_t *net, const char *path) case LAYER_TYPE_POOL: { pool_layer_t *pool_layer = (pool_layer_t *) layer; // 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_data(&fp, &pool_layer->krn_dim, 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 read_data(&fp, &ip_layer->w_size, 4); printf("weights: %lu ", ip_layer->w_size); - ip_layer->w = xalloc(ip_layer->w_size); - read_data(&fp, ip_layer->w, ip_layer->w_size); + ip_layer->wt = xalloc(ip_layer->w_size); + read_data(&fp, ip_layer->wt, ip_layer->w_size); // Alloc and read bias array read_data(&fp, &ip_layer->b_size, 4); printf("bias %lu\n", ip_layer->b_size); - ip_layer->b = xalloc(ip_layer->b_size); - read_data(&fp, ip_layer->b, ip_layer->b_size); + ip_layer->bias = xalloc(ip_layer->b_size); + read_data(&fp, ip_layer->bias, ip_layer->b_size); break; } } @@ -234,7 +234,7 @@ int nn_load_network(nn_t *net, const char *path) if (layer->type == LAYER_TYPE_CONV) { 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); } @@ -269,7 +269,7 @@ error: 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; } diff --git a/src/omv/nn/nn.h b/src/omv/nn/nn.h index bd6b03e08..8af43946b 100644 --- a/src/omv/nn/nn.h +++ b/src/omv/nn/nn.h @@ -26,22 +26,25 @@ typedef enum { NETWORK_TYPE_CAFFE = 0, } 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 { - layer_type_t type; - uint32_t c, h, w; - struct _layer *prev; - struct _layer *next; + NN_LAYER_BASE; } layer_t; typedef struct { - layer_t base; + NN_LAYER_BASE; uint32_t r_mean; uint32_t g_mean; uint32_t b_mean; } data_layer_t; typedef struct { - layer_t base; + NN_LAYER_BASE; uint32_t l_shift; uint32_t r_shift; uint32_t krn_dim; @@ -49,28 +52,28 @@ typedef struct { uint32_t krn_pad; uint32_t w_size; uint32_t b_size; - int8_t *w, *b; + int8_t *wt, *bias; } conv_layer_t; typedef struct { - layer_t base; + NN_LAYER_BASE; } relu_layer_t; typedef struct { - layer_t base; - pool_type_t type; + NN_LAYER_BASE; + pool_type_t ptype; uint32_t krn_dim; uint32_t krn_str; uint32_t krn_pad; } pool_layer_t; typedef struct { - layer_t base; + NN_LAYER_BASE; uint32_t l_shift; uint32_t r_shift; uint32_t w_size; uint32_t b_size; - int8_t *w, *b; + int8_t *wt, *bias; } ip_layer_t; typedef struct { @@ -84,5 +87,5 @@ typedef struct { int nn_dump_network(nn_t *net); 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__