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

C语言实现CNN的前向推理

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

C语言实现CNN的前向推理

  利用Python训练模型,提取模型参数到C语言的头文件,C语言进行前向推理计算。

目录
  • 1.填充算子
    • 1.1多维数组实现
    • 1.2一维数组实现
  • 2.卷积算子
    • 2.1多维数组实现
    • 2.2一维数组实现
  • 3.池化算子
    • 3.1多维数组实现
    • 3.2一维数组实现
  • 4.全连接算子

1.填充算子

  有时我们还希望输入和输出的大小应该保持一致。为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充,也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“0”来进行填充的。

1.1多维数组实现
for (col=0;col 

  填充一圈,多维数组容易操作,先初始化一个全零的二维数组,然后将数据进行对应替换,填充多圈类似。

1.2一维数组实现
for (int col=0;col 
2.卷积算子 

  卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。

2.1多维数组实现
for (outChs=0;outChs0?out2[outChs][col][row]:0;
            }
        }
    }
2.2一维数组实现
for (int outChs=0;outChs0?out1[outChs*OUTPUT2*OUTPUT2+col*OUTPUT2+row]:0;
            }
        }
    }
3.池化算子

  在CNN网络中卷积池之后会跟上一个池化层,池化层的作用是提取局部均值与最大值,根据计算出来的值不一样就分为均值池化层与最大值池化层,一般常见的多为最大值池化层。

3.1多维数组实现
for (outChs=0;outChs
                            out3[outChs][col][row]?out2[outChs][col*POOL_STRIDE1+i][row*POOL_STRIDE1+j]:out3[outChs][col][row];
                    }
                }
            }
        }
    }
    }
3.2一维数组实现
for (int outChs=0;outChs
                            out2[outChs*OUTPUT3*OUTPUT3+col*OUTPUT3+row]?out1[outChs*OUTPUT2*OUTPUT2+(col*POOL_STRIDE1+i)*OUTPUT2+row*POOL_STRIDE1+j]:out2[outChs*OUTPUT3*OUTPUT3+col*OUTPUT3+row];
                    }
                }
            }
        }
    }
4.全连接算子

  全连接层的主要目的就是维度变换,把高维的数据变成低维,在这个过程中,有用的信息保留下来,但是损失特征的位置信息。

for (int fci=0;fci0 ? out2[fci]:0;
    }

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

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

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