diff --git a/PORTING/CNN/cnn.c b/PORTING/CNN/cnn.c index 0b268bf..0fbabe7 100644 --- a/PORTING/CNN/cnn.c +++ b/PORTING/CNN/cnn.c @@ -41,14 +41,15 @@ float* expand(const float* old_matrix, int old_matrix_length, int layer){ //c_rl 输出图像的边长:100 //返回卷积的结果 float* convolution(Model model_w, Model model_b, const float* input_matrix, int input_matrix_length){ + DEBUG_PRINTF("卷积开始\r\n"); // 初始化卷积层参数 int im_l = input_matrix_length; int cr_l = input_matrix_length - 2; float conv_temp; // 临时变量,用于存储卷积计算的中间结果 //用于合并前的数组,具有32*64*50*50(第二层)的大小 - float* _conv_rlst = (float *) mymalloc(SRAMEX,sizeof (float) * model_w.channel * model_w.num_kernels * (cr_l * cr_l)); - memset(_conv_rlst, 0, sizeof (float) * model_w.channel * model_w.num_kernels * (cr_l * cr_l)); + float* _conv_rlst = (float *) mymalloc(SRAMEX,sizeof (float) * model_w.num_kernels * (cr_l * cr_l)); + memset(_conv_rlst, 0, sizeof (float) * model_w.num_kernels * (cr_l * cr_l)); //子图合并后的数组 float* conv_rlst = (float *) mymalloc(SRAMEX,sizeof (float) * model_w.num_kernels * (cr_l * cr_l)); memset(conv_rlst, 0, sizeof (float) * model_w.num_kernels * (cr_l * cr_l)); @@ -67,32 +68,36 @@ float* convolution(Model model_w, Model model_b, const float* input_matrix, int * model_w.array[((c+k*model_w.channel)*3*3) + (x*3+y)]; } } - _conv_rlst[(c*model_w.num_kernels*cr_l*cr_l) + (k*cr_l*cr_l) + (row*cr_l+col)] = conv_temp; + _conv_rlst[(k*cr_l*cr_l) + (row*cr_l+col)] = conv_temp; } } } - } - //合并子图 - { + //合并子图 for(int k=0; k < model_w.num_kernels; k++) { for (int row = 0; row < cr_l; row++) { for (int col = 0; col < cr_l; col++) { - conv_temp = 0; // 每个输出像素初始化为0 - for (int c = 0; c < model_w.channel; c++) { - conv_temp += _conv_rlst[(c * model_w.num_kernels * cr_l * cr_l) + (k * cr_l * cr_l) + (row * cr_l + col)]; - } - // 加上对应卷积核的偏置 - conv_temp += model_b.array[k]; - // 激活函数:ReLU(将小于0的值设为0) - if (conv_temp > 0) - conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = conv_temp; // 如果卷积结果大于0,存入结果数组 - else - conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = 0; // 否则存入0 + conv_rlst[(k*cr_l*cr_l) + (row*cr_l+col)] += _conv_rlst[(k*cr_l*cr_l) + (row*cr_l+col)]; } } } } + for(int k=0; k < model_w.num_kernels; k++) { + for (int row = 0; row < cr_l; row++) { + for (int col = 0; col < cr_l; col++) { + conv_temp = conv_rlst[(k * cr_l * cr_l) + (row * cr_l + col)]; + // 加上对应卷积核的偏置 + conv_temp += model_b.array[k]; + // 激活函数:ReLU(将小于0的值设为0) + if (conv_temp > 0) + conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = conv_temp; // 如果卷积结果大于0,存入结果数组 + else + conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = 0; // 否则存入0 + } + } + } myfree(SRAMEX,_conv_rlst); + _conv_rlst = NULL; + DEBUG_PRINTF("卷积结束\r\n"); return conv_rlst; } @@ -268,11 +273,14 @@ float* generateMatrix(Model model, const float* value) } void cnn_run(){ + DEBUG_PRINTF("开始CNN\r\n"); float value[3] = {0}; calculate_statistics(data,&value[0]); if (check_threshold(data,&value[0])){ float* _data = generateMatrix(data,&value[0]); + + DEBUG_PRINTF("开始第一层\r\n"); //第一层:填充102 * 102 float* expand_matrix_1 = expand(_data, 100, 1); float* conv_rlst_1 = convolution(conv1_weight,conv1_bias,expand_matrix_1, 102); @@ -285,6 +293,8 @@ void cnn_run(){ myfree(SRAMEX,conv_rlst_1); conv_rlst_1 = NULL; + + DEBUG_PRINTF("开始第二层\r\n"); //第二层:填充32 * 52 * 52 float* expand_matrix_2 = expand(pool_rslt_1, 50, 32); float* conv_rlst_2 = convolution(conv2_weight,conv2_bias,expand_matrix_2, 52); @@ -297,6 +307,8 @@ void cnn_run(){ myfree(SRAMEX,conv_rlst_2); conv_rlst_2 = NULL; + + DEBUG_PRINTF("开始第三层\r\n"); //第三层:填充 64 * 27 * 27 float* expand_matrix_3 = expand(pool_rslt_2, 25, 64); float* conv_rlst_3 = convolution(conv3_weight,conv3_bias,expand_matrix_3, 27); @@ -309,7 +321,10 @@ void cnn_run(){ myfree(SRAMEX,conv_rlst_3); conv_rlst_3 = NULL; + DEBUG_PRINTF("开始第四层\r\n"); float* affine1_rslt = hidden(pool_rslt_3); + + DEBUG_PRINTF("开始第五层\r\n"); float* affine2_rslt = output(affine1_rslt); myfree(SRAMEX,pool_rslt_3); diff --git a/PORTING/CNN/cnn_model.c b/PORTING/CNN/cnn_model.c index d749571..ce6ddb8 100644 --- a/PORTING/CNN/cnn_model.c +++ b/PORTING/CNN/cnn_model.c @@ -165,8 +165,8 @@ u8 model_write(char* model_name) u8 _times=0; u32 _larr = 0; u8 _len = strlen(model_name); - char _path[_len+1+7+30]; - char _datapath[_len+1+7+30]; + char _path[_len+1+7+35]; + char _datapath[_len+1+7+35]; char _fstr[READLENGTH+1] = {0}; char _sstr[2]; int progress; @@ -284,7 +284,7 @@ u8 model_read(char* model_name, u32 start, u32 end, u32 gap){ u8 model_switchdata(char* data_name){ u8 _len = strlen(data_name); - char _path[_len+1+7]; + char _path[_len+1+7+35]; if(data.array != NULL)modelmym_free("data"); sprintf(_path, "0:/dataset/_data/%s.txt",data_name); if(f_open(file,(const TCHAR*)_path,1)){ diff --git a/PORTING/CNN/debug.c b/PORTING/CNN/debug.c index 00ab347..d3c1b99 100644 --- a/PORTING/CNN/debug.c +++ b/PORTING/CNN/debug.c @@ -2,7 +2,7 @@ #include "led.h" -u8 _DEBUG = 0; +u8 _DEBUG = 1;