优化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; // 临时变量,用于存储卷积计算的中间结果
|
float conv_temp; // 临时变量,用于存储卷积计算的中间结果
|
||||||
|
|
||||||
//用于合并前的数组,具有32*64*50*50(第二层)的大小
|
//用于合并前的数组,具有32*64*50*50(第二层)的大小
|
||||||
float* _conv_rlst = (float *) malloc(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.channel * 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));
|
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));
|
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)];
|
* 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 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; // 每个输出像素初始化为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)];
|
|
||||||
}
|
|
||||||
// 加上对应卷积核的偏置
|
|
||||||
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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);
|
free(_conv_rlst);
|
||||||
|
_conv_rlst = NULL;
|
||||||
return conv_rlst;
|
return conv_rlst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user