移植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
|
||||
//<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){
|
||||
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ\r\n");
|
||||
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int im_l = input_matrix_length;
|
||||
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>
|
||||
|
||||
//<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));
|
||||
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));
|
||||
//<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));
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//<2F>ϲ<EFBFBD><CFB2><EFBFBD>ͼ
|
||||
{
|
||||
//<2F>ϲ<EFBFBD><CFB2><EFBFBD>ͼ
|
||||
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; // ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD>ʼ<EFBFBD><CABC>Ϊ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)];
|
||||
}
|
||||
// <20><><EFBFBD>϶<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>ƫ<EFBFBD><C6AB>
|
||||
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>
|
||||
if (conv_temp > 0)
|
||||
conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = conv_temp; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
else
|
||||
conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>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)];
|
||||
// <20><><EFBFBD>϶<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>ƫ<EFBFBD><C6AB>
|
||||
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>
|
||||
if (conv_temp > 0)
|
||||
conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = conv_temp; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
else
|
||||
conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
||||
}
|
||||
}
|
||||
}
|
||||
myfree(SRAMEX,_conv_rlst);
|
||||
_conv_rlst = NULL;
|
||||
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
|
||||
return conv_rlst;
|
||||
}
|
||||
|
||||
@@ -268,11 +273,14 @@ float* generateMatrix(Model model, const float* value)
|
||||
}
|
||||
|
||||
void cnn_run(){
|
||||
DEBUG_PRINTF("<EFBFBD><EFBFBD>ʼ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("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>\r\n");
|
||||
//<2F><>һ<EFBFBD>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD>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("<EFBFBD><EFBFBD>ʼ<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>\r\n");
|
||||
//<2F>ڶ<EFBFBD><DAB6>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD>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("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD> 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("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD>\r\n");
|
||||
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);
|
||||
|
||||
myfree(SRAMEX,pool_rslt_3);
|
||||
|
||||
@@ -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)){
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "led.h"
|
||||
|
||||
|
||||
u8 _DEBUG = 0;
|
||||
u8 _DEBUG = 1;
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user