栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

用C语言实现单通道的卷积(conv )、池化(max and average pooling、填充(Padding)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用C语言实现单通道的卷积(conv )、池化(max and average pooling、填充(Padding)

用C语言实现单通道的卷积 、激活、池化、全连接
    • 一、单通道的卷积 conv
    • 二、单通道池化pooling
      • 1.max_pooling 最大池化
      • 2.average_pooling 平均池化
    • 三、填充(Padding)

一、单通道的卷积 conv
#include 

//单卷积
//IMG:5x5    kernel:3x3    out:3x3   
//计算公式:(f-w+2p)/s + 1       
//其中f是矩阵的大小  w是卷积核的大小 p是padding填充 s是步长(默认为1)
#define IMG_SIZE 5
#define W_SIZE 3
#define OUT_SIZE 3   // 根据计算公式: (5-3+2*0)/1 +1 = 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;
    // 步长s=1滑动 进行 行卷积核列卷积
    for(k=0;k<=IMG_SIZE-W_SIZE;k++)  //行卷积
    {
        for(r=0;r<=IMG_SIZE-W_SIZE;r++)  //列卷积
        {
            tmp = 0.0f;  //每次计算时需要将tmp清零  来存放下一次的值(避免计算叠加)
            //单点卷积计算
            for(i=0;i 

运行结果:

二、单通道池化pooling 1.max_pooling 最大池化
//单通道最大池化 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[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 

2.average_pooling 平均池化
//单通道平均池化maxpooling
#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 

三、填充(Padding)
//padding  使得图像卷积后的输入和输出不变   
// 根据计算公式: (4-3+2*p)/1 +1 = 4  ->p=1
//
#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;
    //先全部填充为0 
     for(i=0;i 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/348155.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号