利用Python训练模型,提取模型参数到C语言的头文件,C语言进行前向推理计算。
- 1.填充算子
- 1.1多维数组实现
- 1.2一维数组实现
- 2.卷积算子
- 2.1多维数组实现
- 2.2一维数组实现
- 3.池化算子
- 3.1多维数组实现
- 3.2一维数组实现
- 4.全连接算子
有时我们还希望输入和输出的大小应该保持一致。为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充,也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“0”来进行填充的。
1.1多维数组实现for (col=0;col填充一圈,多维数组容易操作,先初始化一个全零的二维数组,然后将数据进行对应替换,填充多圈类似。
1.2一维数组实现for (int col=0;col2.卷积算子 卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
2.1多维数组实现for (outChs=0;outChs2.2一维数组实现0?out2[outChs][col][row]:0; } } } for (int outChs=0;outChs3.池化算子0?out1[outChs*OUTPUT2*OUTPUT2+col*OUTPUT2+row]:0; } } } 在CNN网络中卷积池之后会跟上一个池化层,池化层的作用是提取局部均值与最大值,根据计算出来的值不一样就分为均值池化层与最大值池化层,一般常见的多为最大值池化层。
3.1多维数组实现for (outChs=0;outChs3.2一维数组实现out3[outChs][col][row]?out2[outChs][col*POOL_STRIDE1+i][row*POOL_STRIDE1+j]:out3[outChs][col][row]; } } } } } } for (int outChs=0;outChs4.全连接算子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]; } } } } } 全连接层的主要目的就是维度变换,把高维的数据变成低维,在这个过程中,有用的信息保留下来,但是损失特征的位置信息。
for (int fci=0;fci0 ? out2[fci]:0; }



