移植c-cnn:验证通过
ok,但代码未精简
This commit is contained in:
@@ -41,14 +41,15 @@ float* expand(const float* old_matrix, int old_matrix_length, int layer){
|
|||||||
//c_rl <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ı߳<C4B1><DFB3><EFBFBD>100
|
//c_rl <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ı߳<C4B1><DFB3><EFBFBD>100
|
||||||
//<2F><><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>
|
//<2F><><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>
|
||||||
float* convolution(Model model_w, Model model_b, const float* input_matrix, int input_matrix_length){
|
float* convolution(Model model_w, Model model_b, const float* input_matrix, int input_matrix_length){
|
||||||
|
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ\r\n");
|
||||||
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
int im_l = input_matrix_length;
|
int im_l = input_matrix_length;
|
||||||
int cr_l = input_matrix_length - 2;
|
int cr_l = input_matrix_length - 2;
|
||||||
float conv_temp; // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
|
float conv_temp; // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
//<2F><><EFBFBD>ںϲ<DABA>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>飬<EFBFBD><E9A3AC><EFBFBD><EFBFBD>32*64*50*50(<28>ڶ<EFBFBD><DAB6><EFBFBD>)<29>Ĵ<EFBFBD>С
|
//<2F><><EFBFBD>ںϲ<DABA>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>飬<EFBFBD><E9A3AC><EFBFBD><EFBFBD>32*64*50*50(<28>ڶ<EFBFBD><DAB6><EFBFBD>)<29>Ĵ<EFBFBD>С
|
||||||
float* _conv_rlst = (float *) mymalloc(SRAMEX,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.channel * model_w.num_kernels * (cr_l * cr_l));
|
memset(_conv_rlst, 0, sizeof (float) * model_w.num_kernels * (cr_l * cr_l));
|
||||||
//<2F><>ͼ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//<2F><>ͼ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
float* conv_rlst = (float *) mymalloc(SRAMEX,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));
|
memset(conv_rlst, 0, sizeof (float) * model_w.num_kernels * (cr_l * cr_l));
|
||||||
@@ -67,20 +68,23 @@ 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)];
|
* 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;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//<2F>ϲ<EFBFBD><CFB2><EFBFBD>ͼ
|
//<2F>ϲ<EFBFBD><CFB2><EFBFBD>ͼ
|
||||||
{
|
|
||||||
for(int k=0; k < model_w.num_kernels; k++) {
|
for(int k=0; k < model_w.num_kernels; k++) {
|
||||||
for (int row = 0; row < cr_l; row++) {
|
for (int row = 0; row < cr_l; row++) {
|
||||||
for (int col = 0; col < cr_l; col++) {
|
for (int col = 0; col < cr_l; col++) {
|
||||||
conv_temp = 0; // ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD>ʼ<EFBFBD><CABC>Ϊ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 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)];
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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)];
|
||||||
// <20><><EFBFBD>϶<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>ƫ<EFBFBD><C6AB>
|
// <20><><EFBFBD>϶<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>ƫ<EFBFBD><C6AB>
|
||||||
conv_temp += model_b.array[k];
|
conv_temp += model_b.array[k];
|
||||||
// <20><><EFBFBD><EFBFBD><EEBAAF><EFBFBD><EFBFBD>ReLU<4C><55><EFBFBD><EFBFBD>С<EFBFBD><D0A1>0<EFBFBD><30>ֵ<EFBFBD><D6B5>Ϊ0<CEAA><30>
|
// <20><><EFBFBD><EFBFBD><EEBAAF><EFBFBD><EFBFBD>ReLU<4C><55><EFBFBD><EFBFBD>С<EFBFBD><D0A1>0<EFBFBD><30>ֵ<EFBFBD><D6B5>Ϊ0<CEAA><30>
|
||||||
@@ -91,8 +95,9 @@ float* convolution(Model model_w, Model model_b, const float* input_matrix, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
myfree(SRAMEX,_conv_rlst);
|
myfree(SRAMEX,_conv_rlst);
|
||||||
|
_conv_rlst = NULL;
|
||||||
|
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
|
||||||
return conv_rlst;
|
return conv_rlst;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,11 +273,14 @@ float* generateMatrix(Model model, const float* value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void cnn_run(){
|
void cnn_run(){
|
||||||
|
DEBUG_PRINTF("<EFBFBD><EFBFBD>ʼCNN\r\n");
|
||||||
float value[3] = {0};
|
float value[3] = {0};
|
||||||
calculate_statistics(data,&value[0]);
|
calculate_statistics(data,&value[0]);
|
||||||
if (check_threshold(data,&value[0])){
|
if (check_threshold(data,&value[0])){
|
||||||
float* _data = generateMatrix(data,&value[0]);
|
float* _data = generateMatrix(data,&value[0]);
|
||||||
|
|
||||||
|
|
||||||
|
DEBUG_PRINTF("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>\r\n");
|
||||||
//<2F><>һ<EFBFBD>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD>102 * 102
|
//<2F><>һ<EFBFBD>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD>102 * 102
|
||||||
float* expand_matrix_1 = expand(_data, 100, 1);
|
float* expand_matrix_1 = expand(_data, 100, 1);
|
||||||
float* conv_rlst_1 = convolution(conv1_weight,conv1_bias,expand_matrix_1, 102);
|
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);
|
myfree(SRAMEX,conv_rlst_1);
|
||||||
conv_rlst_1 = NULL;
|
conv_rlst_1 = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
DEBUG_PRINTF("<EFBFBD><EFBFBD>ʼ<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>\r\n");
|
||||||
//<2F>ڶ<EFBFBD><DAB6>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD>32 * 52 * 52
|
//<2F>ڶ<EFBFBD><DAB6>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD>32 * 52 * 52
|
||||||
float* expand_matrix_2 = expand(pool_rslt_1, 50, 32);
|
float* expand_matrix_2 = expand(pool_rslt_1, 50, 32);
|
||||||
float* conv_rlst_2 = convolution(conv2_weight,conv2_bias,expand_matrix_2, 52);
|
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);
|
myfree(SRAMEX,conv_rlst_2);
|
||||||
conv_rlst_2 = NULL;
|
conv_rlst_2 = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
DEBUG_PRINTF("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
|
||||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD> 64 * 27 * 27
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD> 64 * 27 * 27
|
||||||
float* expand_matrix_3 = expand(pool_rslt_2, 25, 64);
|
float* expand_matrix_3 = expand(pool_rslt_2, 25, 64);
|
||||||
float* conv_rlst_3 = convolution(conv3_weight,conv3_bias,expand_matrix_3, 27);
|
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);
|
myfree(SRAMEX,conv_rlst_3);
|
||||||
conv_rlst_3 = NULL;
|
conv_rlst_3 = NULL;
|
||||||
|
|
||||||
|
DEBUG_PRINTF("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD>\r\n");
|
||||||
float* affine1_rslt = hidden(pool_rslt_3);
|
float* affine1_rslt = hidden(pool_rslt_3);
|
||||||
|
|
||||||
|
DEBUG_PRINTF("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
|
||||||
float* affine2_rslt = output(affine1_rslt);
|
float* affine2_rslt = output(affine1_rslt);
|
||||||
|
|
||||||
myfree(SRAMEX,pool_rslt_3);
|
myfree(SRAMEX,pool_rslt_3);
|
||||||
|
|||||||
@@ -165,8 +165,8 @@ u8 model_write(char* model_name)
|
|||||||
u8 _times=0;
|
u8 _times=0;
|
||||||
u32 _larr = 0;
|
u32 _larr = 0;
|
||||||
u8 _len = strlen(model_name);
|
u8 _len = strlen(model_name);
|
||||||
char _path[_len+1+7+30];
|
char _path[_len+1+7+35];
|
||||||
char _datapath[_len+1+7+30];
|
char _datapath[_len+1+7+35];
|
||||||
char _fstr[READLENGTH+1] = {0};
|
char _fstr[READLENGTH+1] = {0};
|
||||||
char _sstr[2];
|
char _sstr[2];
|
||||||
int progress;
|
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 model_switchdata(char* data_name){
|
||||||
u8 _len = strlen(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");
|
if(data.array != NULL)modelmym_free("data");
|
||||||
sprintf(_path, "0:/dataset/_data/%s.txt",data_name);
|
sprintf(_path, "0:/dataset/_data/%s.txt",data_name);
|
||||||
if(f_open(file,(const TCHAR*)_path,1)){
|
if(f_open(file,(const TCHAR*)_path,1)){
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
|
||||||
|
|
||||||
u8 _DEBUG = 0;
|
u8 _DEBUG = 1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user