该项目主要实现卷积神经网络Lenet-5 的训练(Python+Kreas+Jupyter Notebook)和推理C语言实现(C+Visual Studio2013)
项目特点:① 卷积参数,如输入宽、输入高、输入通道数、输出通道数、卷积核的大小、步幅大小、pad(1是进行补边,0是不补边),激活函数(1是relu,0是softmax)等可调,通用性比较强。②全连接使用卷积运算实现。③池化采用最大池化。④SAME padding。
github地址:GitHub - wei8171023/CNN_C_forword: 使用c语言完成Lenet-5的前向传播过程
工程的实现主要分为两部分:
第一部分是在python训练Lenet-5-MNIST模型
环境:Python+Kreas+Jupyter Notebook
1.Lenet-5网络搭建模型,训练、保存模型。 (train.ipynb)
2.手写字体预测。通过画图工具获得手写字体,并进行模型推理得到预测结果。 (test.ipynb)
3.提取网络模型每一层的参数(权重和bias),保存为.bin文件。 (get_layers_weight.ipynb)
4.提取测试图片在网络每一层中 的输出结果。(便于在后续c语言实现中对比结果,验证程序的正确性)(get_layer_output.ipynb)
5.将图片转为.bin格式,包括图片的宽高大小、通道数和像素值(image2array.py)
第二部分工作是网络前向推理C实现,
环境:C+Visual Studio2013
1.主函数main.cpp,主函数类似于python中模型搭建,在主函数中调用各个层的的函数,完成向前传播的过程。
2.minst.cpp,主要定义了图片和标签结构体、图片读取,权重和偏置读取函数。
3.cnn.cpp,定义了卷积层,池化层,flatten层函数,以便在主函数中调用。
4.根据需要修改网络结构,以及数据存放位置。
5.直接运行就可以了。
所设计的Lenet网络结构如下: