用C语言实现单通道的卷积 、激活、池化、全连接
-
- 一、单通道的卷积 conv
- 二、单通道池化pooling
-
- 1.max_pooling 最大池化
- 2.average_pooling 平均池化
- 三、填充(Padding)
一、单通道的卷积 conv
#include
#define IMG_SIZE 5
#define W_SIZE 3
#define OUT_SIZE 3
int conv(float img[IMG_SIZE][IMG_SIZE],float w[W_SIZE][W_SIZE],float out[OUT_SIZE][OUT_SIZE])
{
int i,j,k,r;
float tmp;
for(k=0;k<=IMG_SIZE-W_SIZE;k++)
{
for(r=0;r<=IMG_SIZE-W_SIZE;r++)
{
tmp = 0.0f;
for(i=0;i<W_SIZE;i++)
{
for(j=0;j<W_SIZE;j++)
{
tmp = tmp + img[i+k][j+r]*w[i][j];
}
}
out[k][r] = tmp;
}
}
return 0;
}
void conv_test()
{
float img[IMG_SIZE][IMG_SIZE] = {
1,1,1,0,0,
0,1,1,1,0,
0,0,1,1,1,
0,0,1,1,0,
0,1,1,0,0};
float conv_w[W_SIZE][W_SIZE] = {
1,0,1,
0,1,0,
1,0,1};
float img_out[OUT_SIZE][OUT_SIZE];
int i,j;
printf("input picture data:\n");
for(i=0;i<IMG_SIZE;i++)
{
for(j=0;j<IMG_SIZE;j++)
{
printf("%.1f ",img[i][j]);
}
printf("\n");
}
printf("input weight data:\n");
for(i=0;i<W_SIZE;i++)
{
for(j=0;j<W_SIZE;j++)
{
printf("%.1f ",conv_w[i][j]);
}
printf("\n");
}
conv(img,conv_w,img_out);
printf("output picture data:\n");
for(i=0;i<OUT_SIZE;i++)
{
for(j=0;j<OUT_SIZE;j++)
{
printf("%.1f ",img_out[i][j]);
}
printf("\n");
}
}
int main()
{
conv_test();
return 0;
}
运行结果:

二、单通道池化pooling
1.max_pooling 最大池化
#define IMG_POOL_SIZE 4
#define OUT_POOL_SIZE 2
int max_pooling(float img[IMG_POOL_SIZE][IMG_POOL_SIZE],float out[OUT_POOL_SIZE][OUT_POOL_SIZE])
{
int i,j,k,r;
float tmp1,tmp2,tmp3;
for(i=0,k=0;i<IMG_POOL_SIZE,k<OUT_POOL_SIZE;i=i+2,k++)
{
for(j=0,r=0;j<IMG_POOL_SIZE,r<OUT_POOL_SIZE;j=j+2,r++)
{
tmp1 = 0.0f;
tmp2 = 0.0f;
tmp3 = 0.0f;
tmp1 = img[i][j] > img[i][j+1] ? img[i][j]:img[i][j+1];
tmp2 = img[i+1][j] > img[i+1][j+1] ? img[i+1][j] : img[i+1][j+1];
tmp3 = tmp1 > tmp2 ? tmp1:tmp2;
out[k][r] = tmp3;
}
}
return 0;
}
void max_pooling_test()
{
float img[IMG_POOL_SIZE][IMG_POOL_SIZE] = {
5,6,1,0,
3,2,3,8,
5,6,9,1,
7,8,6,7
};
float img_out[OUT_POOL_SIZE][OUT_POOL_SIZE];
int i,j;
printf("input picture data:\n");
for(i=0;i<IMG_POOL_SIZE;i++)
{
for(j=0;j<IMG_POOL_SIZE;j++)
{
printf("%.1f ",img[i][j]);
}
printf("\n");
}
max_pooling(img,img_out);
printf("output picture data:\n");
for(i=0;i<OUT_POOL_SIZE;i++)
{
for(j=0;j<OUT_POOL_SIZE;j++)
{
printf("%.1f ",img_out[i][j]);
}
printf("\n");
}
}
int main()
{
max_pooling_test();
return 0;
}

2.average_pooling 平均池化
#define IMG_POOL_SIZE 4
#define OUT_POOL_SIZE 2
int average_pooling(float img[IMG_POOL_SIZE][IMG_POOL_SIZE],float out[OUT_POOL_SIZE][OUT_POOL_SIZE])
{
int i,j,k,r;
float tmp1,tmp2,tmp3;
for(i=0,k=0;i<IMG_POOL_SIZE,k<OUT_POOL_SIZE;i=i+2,k++)
{
for(j=0,r=0;j<IMG_POOL_SIZE,r<OUT_POOL_SIZE;j=j+2,r++)
{
tmp1 = 0.0f;
tmp2 = 0.0f;
tmp3 = 0.0f;
tmp1 = img[i][j] + img[i][j+1];
tmp2 = img[i+1][j] + img[i+1][j+1];
tmp3 = tmp1 + tmp2 ;
out[k][r] = tmp3/4;
}
}
}
void average_pooling_test()
{
float img[IMG_POOL_SIZE][IMG_POOL_SIZE] = {
5,6,1,0,
3,2,3,8,
5,6,9,1,
7,8,6,7
};
float img_out[OUT_POOL_SIZE][OUT_POOL_SIZE];
int i,j;
printf("input picture data:\n");
for(i=0;i<IMG_POOL_SIZE;i++)
{
for(j=0;j<IMG_POOL_SIZE;j++)
{
printf("%.1f ",img[i][j]);
}
printf("\n");
}
average_pooling(img,img_out);
printf("output picture data:\n");
for(i=0;i<OUT_POOL_SIZE;i++)
{
for(j=0;j<OUT_POOL_SIZE;j++)
{
printf("%.1f ",img_out[i][j]);
}
printf("\n");
}
}
int main()
{
average_pooling_test();
return 0;
}

三、填充(Padding)
#define IMG_P_SIZE 4
#define Padding 1
#define OUT_P_SIZE (Padding*2 + IMG_P_SIZE)
int padding(float img[IMG_P_SIZE][IMG_P_SIZE],float out[OUT_P_SIZE][OUT_P_SIZE])
{
int i,j;
for(i=0;i<OUT_P_SIZE;i++)
{
for(j=0;j<OUT_P_SIZE;j++)
{
out[i][j] = 0.0f;
}
}
for(i=1;i<OUT_P_SIZE-1;i++)
{
for(j=1;j<OUT_P_SIZE-1;j++)
{
out[i][j] = img[i-1][j-1];
}
}
}
void padding_test()
{
float img[IMG_P_SIZE][IMG_P_SIZE] = {
5,6,1,0,
3,2,3,8,
5,6,9,1,
7,8,6,7
};
float img_out[OUT_P_SIZE][OUT_P_SIZE];
int i,j;
printf("input picture data:\n");
for(i=0;i<IMG_P_SIZE;i++)
{
for(j=0;j<IMG_P_SIZE;j++)
{
printf("%.1f ",img[i][j]);
}
printf("\n");
}
padding(img,img_out);
printf("output picture data:\n");
for(i=0;i<OUT_P_SIZE;i++)
{
for(j=0;j<OUT_P_SIZE;j++)
{
printf("%.1f ",img_out[i][j]);
}
printf("\n");
}
}
int main()
{
padding_test();
return 0;
}
