修复expand函数中无法malloc的bug:
原因是free的时候没有消除指针悬挂
This commit is contained in:
26
cnn.c
26
cnn.c
@@ -17,11 +17,6 @@ void print_rslt(float* rslt, u8 input_matrix_length, u32 length){
|
|||||||
// 将原始矩阵复制到填充后的矩阵中央
|
// 将原始矩阵复制到填充后的矩阵中央
|
||||||
float* expand(const float* old_matrix, int old_matrix_length, int layer){
|
float* expand(const float* old_matrix, int old_matrix_length, int layer){
|
||||||
float* new_matrix = (float *)malloc(sizeof(float)*layer*(old_matrix_length+2)*(old_matrix_length+2));
|
float* new_matrix = (float *)malloc(sizeof(float)*layer*(old_matrix_length+2)*(old_matrix_length+2));
|
||||||
if (new_matrix == NULL) {
|
|
||||||
// 处理 malloc 失败的情况,例如打印错误并退出
|
|
||||||
perror("Memory allocation failed");
|
|
||||||
exit(1); // 退出程序
|
|
||||||
}
|
|
||||||
memset(new_matrix, 0, sizeof(float)*layer*(old_matrix_length+2)*(old_matrix_length+2));
|
memset(new_matrix, 0, sizeof(float)*layer*(old_matrix_length+2)*(old_matrix_length+2));
|
||||||
for(int l=0; l < layer; l++){
|
for(int l=0; l < layer; l++){
|
||||||
for (int i = 0; i < old_matrix_length; i++) {
|
for (int i = 0; i < old_matrix_length; i++) {
|
||||||
@@ -272,42 +267,55 @@ void cnn_run(){
|
|||||||
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]);
|
||||||
|
|
||||||
// printf("最大值:%f 平均值:%f 标准差:%f\r\n",value[0],value[1],value[2]);
|
|
||||||
// print_rslt(_data,100,1*100*100);
|
|
||||||
|
|
||||||
//第一层:填充102 * 102
|
//第一层:填充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);
|
||||||
float* pool_rslt_1 = pooling(conv1_weight, conv_rlst_1, 100);
|
float* pool_rslt_1 = pooling(conv1_weight, conv_rlst_1, 100);
|
||||||
|
|
||||||
free(_data);
|
free(_data);
|
||||||
|
_data = NULL;
|
||||||
free(expand_matrix_1);
|
free(expand_matrix_1);
|
||||||
|
expand_matrix_1 = NULL;
|
||||||
free(conv_rlst_1);
|
free(conv_rlst_1);
|
||||||
|
conv_rlst_1 = NULL;
|
||||||
|
|
||||||
//第二层:填充32 * 52 * 52
|
//第二层:填充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);
|
||||||
float* pool_rslt_2 = pooling(conv2_weight, conv_rlst_2, 50);
|
float* pool_rslt_2 = pooling(conv2_weight, conv_rlst_2, 50);
|
||||||
|
|
||||||
free(pool_rslt_1);
|
free(pool_rslt_1);
|
||||||
|
pool_rslt_1 = NULL;
|
||||||
free(expand_matrix_2);
|
free(expand_matrix_2);
|
||||||
|
expand_matrix_2 = NULL;
|
||||||
free(conv_rlst_2);
|
free(conv_rlst_2);
|
||||||
|
conv_rlst_2 = NULL;
|
||||||
|
|
||||||
//第三层:填充 64 * 27 * 27
|
//第三层:填充 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);
|
||||||
float* pool_rslt_3 = pooling(conv3_weight, conv_rlst_3, 25);
|
float* pool_rslt_3 = pooling(conv3_weight, conv_rlst_3, 25);
|
||||||
|
|
||||||
free(pool_rslt_2);
|
free(pool_rslt_2);
|
||||||
|
pool_rslt_2 = NULL;
|
||||||
free(expand_matrix_3);
|
free(expand_matrix_3);
|
||||||
|
expand_matrix_3 = NULL;
|
||||||
free(conv_rlst_3);
|
free(conv_rlst_3);
|
||||||
|
conv_rlst_3 = NULL;
|
||||||
|
|
||||||
float* affine1_rslt = hidden(pool_rslt_3);
|
float* affine1_rslt = hidden(pool_rslt_3);
|
||||||
float* affine2_rslt = output(affine1_rslt);
|
float* affine2_rslt = output(affine1_rslt);
|
||||||
|
|
||||||
free(pool_rslt_3);
|
free(pool_rslt_3);
|
||||||
|
pool_rslt_3 = NULL;
|
||||||
free(affine1_rslt);
|
free(affine1_rslt);
|
||||||
|
affine1_rslt = NULL;
|
||||||
free(affine2_rslt);
|
free(affine2_rslt);
|
||||||
|
affine2_rslt = NULL;
|
||||||
|
|
||||||
|
} else{
|
||||||
|
printf("未放电!最大值:%f 平均值:%f 标准差:%f\r\n",value[0],value[1],value[2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ u8 model_switchdata(char* data_name){
|
|||||||
DEBUG_PRINTF("Data数据集[%s]切换失败!!\r\n",data_name);
|
DEBUG_PRINTF("Data数据集[%s]切换失败!!\r\n",data_name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else printf("Data数据集[%s]切换成功!\r\n",data_name);
|
else DEBUG_PRINTF("Data数据集[%s]切换成功!\r\n",data_name);
|
||||||
DEBUG_PRINTF("data_name的长度为:%d\r\n_path的长度为:%d\r\n_path为:%s\r\n",_len,sizeof(_path),_path);
|
DEBUG_PRINTF("data_name的长度为:%d\r\n_path的长度为:%d\r\n_path为:%s\r\n",_len,sizeof(_path),_path);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
24
main.c
24
main.c
@@ -6,8 +6,9 @@
|
|||||||
#include "cnn.h"
|
#include "cnn.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void run_dataset(){
|
void run_dataset(){
|
||||||
char* modelusearr[] = {
|
char* modelusearr_origin[] = {
|
||||||
"C1autosave00095_right_new_2",
|
"C1autosave00095_right_new_2",
|
||||||
"C1autosave00096_right_new_2",
|
"C1autosave00096_right_new_2",
|
||||||
"C1autosave00097_right_new_2",
|
"C1autosave00097_right_new_2",
|
||||||
@@ -69,6 +70,23 @@ void run_dataset(){
|
|||||||
"filtered_C1autosave00039_right_new",
|
"filtered_C1autosave00039_right_new",
|
||||||
"filtered_C1autosave00062_right_new",
|
"filtered_C1autosave00062_right_new",
|
||||||
};
|
};
|
||||||
|
char* modelusearr_out[] = {
|
||||||
|
"split_1",
|
||||||
|
"split_2",
|
||||||
|
"split_3",
|
||||||
|
"split_4",
|
||||||
|
"split_5",
|
||||||
|
"split_6",
|
||||||
|
"split_7",
|
||||||
|
"split_8",
|
||||||
|
"split_9",
|
||||||
|
"split_10",
|
||||||
|
};
|
||||||
|
/* 可用数据集如下
|
||||||
|
* modelusearr_origin
|
||||||
|
* modelusearr_out
|
||||||
|
*/
|
||||||
|
#define modelusearr modelusearr_origin
|
||||||
for(int a=0;a<(sizeof(modelusearr) / sizeof(modelusearr[0]));a++){
|
for(int a=0;a<(sizeof(modelusearr) / sizeof(modelusearr[0]));a++){
|
||||||
SDRAM_USED();
|
SDRAM_USED();
|
||||||
model_switchdata(modelusearr[a]);
|
model_switchdata(modelusearr[a]);
|
||||||
@@ -83,8 +101,6 @@ int main(){
|
|||||||
model_write("all");
|
model_write("all");
|
||||||
|
|
||||||
run_dataset();
|
run_dataset();
|
||||||
// model_switchdata("C1autosave00095_right_new_2");
|
|
||||||
// cnn_run();
|
|
||||||
|
|
||||||
DEBUG_PRINTF("\r\nEnd结束");
|
DEBUG_PRINTF("\r\nEnd结束");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user