这几天抽时间学习了一下很久之前就想学习的BP神经网络。通过阅读西瓜书的神经网络部分的原理和参考了网上几篇博客,我自己用C++编写、实现了一个单隐层BP神经网络。
简单画了个示意图,好理解下面给出的公式:(注意:图中省略了其他的节点之间的连线)
西瓜书上的BP神经网络训练流程:
训练流程:
输入:训练集D={(xk,yk)},学习率η
过程:
在(0,1)范围内随机初始化网络中的所有连接权和阈值
repeat
for all (xk,yk)ⅭD do
计算当前样本的输出yk;
计算输出层神经元的梯度项gj;
计算隐藏层神经元梯度项ek;
更新连接权值wh,j,vi,j与阈值θj,ϒh;
end for
until 达到停止条件
输出:连接权值与阈值确定的单隐层前馈神经网络
在这里,我就不解释BP神经网络了,西瓜书上写得十分详细和明白,我直接上程序。
关于矩阵处理,C++不如python来得快和方便,但是只要是算法都是能够运用任何一种语言描述出来的。这里,为了方便矩阵的运算,我加入了Eigen库。Eigen库不用安装,直接下载好然后再配置一下就好。关于Eigen配置和使用可以参照博客:https://blog.youkuaiyun.com/fengbingchun/article/details/47378515
不说了,接下来上代码。
1、单隐层BP神经网络类设计
代码中的注释已经很详细了,我就不解释了。