1. 本项目的优点
- 纯C++实现,不依赖三方库,仅用到C++标准库
- 项目结构简单,BPnet的实现仅用到3个头文件和3个源文件
2. 技术背景
- BP神经网络是什么?
- 这个问题相信大家在找BP神经网络代码实现之前已经看了不少其公式推导和实现原理,这里不再赘述。
- 在代码实现上秩序记住BP:Back Propagation,即反向传播即可。
- 为什么要用C++实现?
- 众所周知,利用Tensorflow、Pytorch等一系列框架可以很方便地搭建起自己的神经网络,像BP神经网络这种简单结构秩序几行代码即可实现。
- 但最近的项目上遇到一个简单的拟合任务,用上面的经典框架可以实现但比较笨重(安装框架等),而且有的机器上没有python运行环境。于是开始寻找用C++来实现BP神经网络的代码。
- 该项目基于函数计算,只用到了C++标准库,很方便移植,而且完美契合我的需求(简单、不依赖三方库)。
3. BP神经网络实现
3.1 参考博客
- 在第一次用C++搭建BP神经网络的时候参考了这篇博客:C++实现的BP神经网络(代码于详解)。但用这个方法增加隐含层比较困难,遂放弃,但还是要感谢博主。
- 后面继续冲浪找到了一个可以随意增加层数和节点数的方法:Artificial Neural Network C++ Source Code
3.2 C++实现
- git仓库:bpnet_cpp: BP神经网络c++实现,可通过BPNet类快捷搭建自己的BP神经网络(指定学习率、动量、层数、每层节点数)。
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 |
- 搭建BP神经网络并编译训练,BP神经网络结构如下,共6层。各参数的含义请参考2.1节中的第二篇博客
- 执行./train后,大约1s即可收敛,速度很快。最后一步时误差降至2.40877e-05
- 执行./test进行测试,测试数据和输出结果分别如下,可见效果非常好