BP神经网络C++实现(任意Layer、Node)

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
  • train_data.csv数据如下

  •  搭建BP神经网络并编译训练,BP神经网络结构如下,共6层。各参数的含义请参考2.1节中的第二篇博客

  •  执行./train后,大约1s即可收敛,速度很快。最后一步时误差降至2.40877e-05

  •  执行./test进行测试,测试数据和输出结果分别如下,可见效果非常好