1. 本项目的优点
- 纯C++实现,不依赖三方库,仅用到C++标准库
- 项目结构简单,BPnet的实现仅用到3个头文件和3个源文件
2. 技术背景
![](https://i-blog.csdnimg.cn/blog_migrate/efef3b8772eee4ef8f0941cc13eabc60.png)
- BP神经网络是什么?
- 这个问题相信大家在找BP神经网络代码实现之前已经看了不少其公式推导和实现原理,这里不再赘述。
- 在代码实现上秩序记住BP:Back Propagation,即反向传播即可。
- 为什么要用C++实现?
- 众所周知,利用Tensorflow、Pytorch等一系列框架可以很方便地搭建起自己的神经网络,像BP神经网络这种简单结构秩序几行代码即可实现。
- 但最近的项目上遇到一个简单的拟合任务,用上面的经典框架可以实现但比较笨重(安装框架等),而且有的机器上没有python运行环境。于是开始寻找用C++来实现BP神经网络的代码。
- 该项目基于函数计算,只用到了C++标准库,很方便移植,而且完美契合我的需求(简单、不依赖三方库)。
3. BP神经网络实现
3.1 参考博客
3.2 C++实现
3.2.1 项目文件说明
- /bpnet文件夹为BP网络结构实现和声明
- BPLink、BPNet、NPNode为BPNet网络的实现和声明
- Pattern为BPNet加载数据的一个工具类,本项目实现中使用csv_tool来代替,所以实际并未用到Pattern
- csv_tool.cpp、csv_tool.h为c++程序读取、写入csv文件的工具实现和声明
- train.cpp为训练程序,训练结束会把模型保存为model.nn或自定义其他名称和格式
- test.cpp为测试程序,读取test.csv值并输出预测值至result.csv
- csv文件
- train.csv为模型训练数据,以3输入1输出为例,0列为输出值,1、2,3列为输出值
- test_data.csv为模型输入值
- result.csv为模型预测值
3.2.2 BPnet使用
g++ -o train train.cpp ./bpnet/*.cpp
g++ -o test test.cpp ./bpnet/*.cpp
4. 实例测试
输出 | 输入1 | 输入2 | 输入3 |
---|
0.3 | 0 | 0 | 1 |
0.6 | 0 | 1 | 0 |
0.9 | 1 | 0 | 0 |
![](https://i-blog.csdnimg.cn/blog_migrate/ad89264f721006a5cbde65328858c2f4.png)
- 搭建BP神经网络并编译训练,BP神经网络结构如下,共6层。各参数的含义请参考2.1节中的第二篇博客
![](https://i-blog.csdnimg.cn/blog_migrate/d3c4663d984ba500b764bcd97256a8ca.png)
- 执行./train后,大约1s即可收敛,速度很快。最后一步时误差降至2.40877e-05
![](https://i-blog.csdnimg.cn/blog_migrate/e87e0f6c5ed79960c45e0f8be0f84f22.png)
- 执行./test进行测试,测试数据和输出结果分别如下,可见效果非常好
![](https://i-blog.csdnimg.cn/blog_migrate/1eb2316d9565057e875060122e0fee30.png)
![](https://i-blog.csdnimg.cn/blog_migrate/45f574f60f5e44c80a1aa89030a274ff.png)