优化convolution函数
降低malloc使用的内存
This commit is contained in:
37
cnn.c
37
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user