diff --git a/cnn.c b/cnn.c index 3300878..318fb5c 100644 --- a/cnn.c +++ b/cnn.c @@ -43,8 +43,8 @@ float* convolution(Model model_w, Model model_b, const float* input_matrix, int float conv_temp; // 临时变量,用于存储卷积计算的中间结果 //用于合并前的数组,具有32*64*50*50(第二层)的大小 - float* _conv_rlst = (float *) malloc(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 *) malloc(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 *) malloc(sizeof (float) * model_w.num_kernels * (cr_l * cr_l)); memset(conv_rlst, 0, sizeof (float) * model_w.num_kernels * (cr_l * cr_l)); @@ -63,32 +63,35 @@ 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 + } + } + } free(_conv_rlst); + _conv_rlst = NULL; return conv_rlst; }