使用C++实现的简单ANN(人工神经网络)

github地址
使用C++实现的最简单的人工神经网络,包含梯度下降的反向传播算法(BP)。内有部分注释,适合初学学习。至于为什么不用python?还是觉得从最底层(矩阵运算)写比较能加深印象和对算法的理解。(绝对不是因为我不会写python)
警告,此代码仅为初学学习之用,请勿用作任何工程项目!

一、跑起来

方式一

使用vscode+cmake插件或者Clion打开目录。然后直接编译运行。

方式二

1、确保安装cmake环境,没有请先装cmake。
2、在工程目录下键入:

mkdir build
cd build
cmake ..
make

3、运行build目录下的ANN程序

然后在data目录下生成文件output.csv,这是一个回归函数f(x)=5(x2−x+3.5)f(x)=5(x^2-x+3.5)f(x)=5(x2−x+3.5)的拟合。
拟合情况如下:

二、用起来

1、使用十分简便,首先新建ANN模型,设置误差函数cost及其对于输出层每一项的偏导,这里使用默认的平方差函数

ANNModel model;
model.cost = Sqrt_Cost_Func::sqrt_cost;
model.d_cost = Sqrt_Cost_Func::d_sqrt_cost;

1、设置学习率(一般0.0001~0.1)

model.learning_rate = 0.01;

2、开始添加层级,从输入层开始,直到输出层,这里请保证输入层的神经元个数与输入向量的维度相同。并设置这些层级的激活函数和其导数。

// 输入层 1个神经元
ANNLayer layer0(1);
layer0.activition = Linear_Func::linear;  // 设置本层激活函数为线性函数f(x)=x// 根据ANN结构,输入层的激活函数应设置为线性
layer0.d_activition = Linear_Func::linear;// 设置本层激活函数的导数
model.add_layer(layer0);// 隐藏层 20个神经元
ANNLayer layer1(20);
layer1.activition = Signmod_Func::signmod; // 设置本层激活函数为sigmod
layer1.d_activition = Signmod_Func::d_signmod;
model.add_layer(layer1);// 输出层1个神经院
ANNLayer layer2(1);
layer2.activition = Linear_Func::linear;
layer2.d_activition = Linear_Func::d_linear;
model.add_layer(layer2);

3、编译模型

Compiled_ANNModel compiled_model = model.compile();

4、训练模型,查看输出

Vector data, expectation;
Vector output = compiled_model.feed(data, expectation);

5、只输出,不训练

Vector output = compiled_model.get_output(data);

三、学起来

这里给出最终公式,公式的推导请见其他教程、参考书。

1、获得神经元的激活值,这里使用aj(l)a^{(l)}_jaj(l)​表示第lll层的第jjj个神经元的激活值大小
aj(l)=A(l)(zj(l))a^{(l)}_j=A^{(l)}(z^{(l)}_j)aj(l)​=A(l)(zj(l)​)
其中
zj(l)=∑k=0n(l−1)−1wj,k(l)ak(l−1)+bj(l)z^{(l)}_j=\sum_{k=0}^{n^{(l-1)}-1}w_{j,k}^{(l)}a^{(l-1)}_{k}+b^{(l)}_jzj(l)​=k=0∑n(l−1)−1​wj,k(l)​ak(l−1)​+bj(l)​
其中A(l)A^{(l)}A(l)为第lll层的激活函数,wj,k(l)w_{j,k}^{(l)}wj,k(l)​为从l−1l-1l−1层第kkk个神经元链接到第lll层第jjj个神经元的边权(注意www下标的顺序!),另外bj(l)b^{(l)}_jbj(l)​是第lll层第jjj个神经元的偏置阈值。n(l)n^{(l)}n(l)为第lll层的神经元个数。

2、反向传播公式(以平方差误差函数为例)

σCσwj,k(l)=ak(l−1)A′(l)(zj(l))σCσaj(l)\frac{\sigma C}{\sigma w_{j,k}^{(l)}} = a^{(l-1)}_{k}A^{'(l)}(z^{(l)}_j)\frac{\sigma C}{\sigma a^{(l)}_{j}} σwj,k(l)​σC​=ak(l−1)​A′(l)(zj(l)​)σaj(l)​σC​

其中

σCσaj(l)={∑j=0n(l+1)−1wj,k(l+1)A′(l+1)(zj(l+1))σCσaj(l+1)l≠L2(aj(l)−yj)l=L\frac{\sigma C}{\sigma a^{(l)}_{j}} =\left\{ \begin{aligned} \sum_{j=0}^{n^{(l+1)}-1} w_{j,k}^{(l+1)}A^{'(l+1)}(z^{(l+1)}_j)\frac{\sigma C}{\sigma a^{(l+1)}_{j}} \quad l \neq L\\ 2(a^{(l)}_j-y_j) \quad l = L\\ \end{aligned} \right . σaj(l)​σC​=⎩⎨⎧​j=0∑n(l+1)−1​wj,k(l+1)​A′(l+1)(zj(l+1)​)σaj(l+1)​σC​l=L2(aj(l)​−yj​)l=L​

最终有

Δwj,k(l)=−ησCσwj,k(l)\Delta w_{j,k}^{(l)}=-\eta \frac{\sigma C}{\sigma w_{j,k}^{(l)}}Δwj,k(l)​=−ησwj,k(l)​σC​

Δbj(l)=−ηA′(l)(zj(l))σCσaj(l)\Delta b_{j}^{(l)}= -\eta A^{'(l)}(z^{(l)}_j)\frac{\sigma C}{\sigma a^{(l)}_{j}}Δbj(l)​=−ηA′(l)(zj(l)​)σaj(l)​σC​

最后对www、bbb进行更新如下

wj,k(l):=wj,k(l)+Δwj,k(l)w_{j,k}^{(l)} := w_{j,k}^{(l)} + \Delta w_{j,k}^{(l)}wj,k(l)​:=wj,k(l)​+Δwj,k(l)​
bj,k(l):=bj(l)+Δbj(l)b_{j,k}^{(l)} := b_{j}^{(l)} + \Delta b_{j}^{(l)}bj,k(l)​:=bj(l)​+Δbj(l)​

其中,A′(l)(x)A^{'(l)}(x)A′(l)(x)为第lll层激活函数的导数。CCC为误差函数,yjy_jyj​为预期输出向量的jjj分量。η\etaη为学习率。

具体实现的解释请,见代码注释。

基于C++的简单深度学习ANN(人工神经网络)模型相关推荐

  1. 基于Pytorch的简单深度学习项目实战

    目录 任务详情 训练设置 网络模型 损失函数 优化器 训练步骤 具体代码 导入环境 导入数据 加载数据 创建网络 损失函数 优化器 开始训练 任务详情 利用CIFAR10数据集,基于pytorch环境 ...

  2. [python] 深度学习基础------人工神经网络实现鸢尾花分类(一)

    ​​​​​​​人工神经网络实现鸢尾花分类(一) 人工神经网络实现鸢尾花分类(二) 人工神经网络实现鸢尾花分类(三) 人工神经网络实现鸢尾花分类(四) 人工神经网络实现鸢尾花分类(五) 目录 人工智能主 ...

  3. ann人工神经网络_深度学习-人工神经网络(ANN)

    ann人工神经网络 Building your first neural network in less than 30 lines of code. 用不到30行代码构建您的第一个神经网络. 1.W ...

  4. 基于逻辑回归,支持向量机,朴素贝叶斯以及简单深度学习文本分类方法(BiLSTM、CNN)实现的中文情感分析,含数据集可直接运行

    基于逻辑回归,支持向量机,朴素贝叶斯以及简单深度学习文本分类方法(BiLSTM.CNN)实现的中文情感分析,含数据集可直接运行 完整代码下载地址:中文情感分析 中文情感分析 本项目旨在通过一个中文情感 ...

  5. 值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(下)

    作者 | 黄浴 来源 | 转载自知乎专栏自动驾驶的挑战和发展 [导读]在近日发布的<值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(上)>一文中,作者介绍了一部分各大公司和机构基于 ...

  6. 基于大数据与深度学习的自然语言对话

    基于大数据与深度学习的自然语言对话 发表于2015-12-04 09:44| 7989次阅读| 来源<程序员>电子刊| 5 条评论| 作者李航.吕正东.尚利峰 大数据深度学习自然语言处理自 ...

  7. Segmentation-based deep-learning approach for surface-defectdetection(基于分割的表面缺陷深度学习检测方法)

    论文地址:https://arxiv.org/abs/1903.08536v3 摘要 基于机器学习的表面异常自动检测已经成为一个有趣且有前途的研究领域,对视觉检测的应用领域有着非常直接的影响.深度学习 ...

  8. 基于NVIDIA GPUs的深度学习训练新优化

    基于NVIDIA GPUs的深度学习训练新优化 New Optimizations To Accelerate Deep Learning Training on NVIDIA GPUs 不同行业采用 ...

  9. 第三十五课.基于贝叶斯的深度学习

    目录 贝叶斯公式 基础问题 贝叶斯深度学习与深度学习的区别 贝叶斯神经网络与贝叶斯网络 贝叶斯神经网络的推理与学习 前向计算 学习 贝叶斯公式 首先回顾贝叶斯公式:p(z∣x)=p(x,z)p(x)= ...

最新文章

  1. 台积电2纳米获得重大突破
  2. 机器翻译引擎的基本原理 ——LSTM
  3. 【组合数学】鸽巢原理 ( 鸽巢原理简单形式示例 4、5 )
  4. Hadoop学习第一天
  5. java成绩查询_JavaWeb项目第三次总结_成绩查询的实现
  6. 分时系统的用户具有独占性,因此一个用户可以独占计算机系统的资源.,课件2016计算机操作系统试题库(判断).doc...
  7. 图论 —— 生成树 —— 曼哈顿距离最小生成树
  8. python学习笔记——多线程编程
  9. MYSQL 查看表定义的 4 种方法
  10. 卧槽!还有这种事!马斯克的SpaceX-API 竟然开源了!登顶GitHub热榜!
  11. ICMP协议和ping命令
  12. html给按钮加颜色代码,HTML按钮上的默认颜色代码
  13. Git-Dumper工具:从站点中导出一个Git库
  14. 图纸上标注的是实际尺寸吗_CAD比例画图时,图上标的尺寸,是实际尺寸还是图上尺寸啊?...
  15. 如何使用苹果官方文档
  16. docker基本知识和部署在centos系统
  17. 规则引擎在数据治理平台的实践
  18. Windows Phone 7芒果更新
  19. [AWT] 常用组件
  20. python中的copy.deepcopy()

热门文章

  1. android自定义相机加取景框
  2. LeetcCode 27:移除元素 Remove Element(python、java)
  3. 说说中科院研究生的毕业出路问题
  4. C# 读取AssemblyInfo文件中的属性值
  5. C#中AssemblyInfo.cs文件详解
  6. Odp.net 64位配置详细说明
  7. 绿坝其实是死在了自己手里
  8. 从《头号玩家》说起,聊聊当前的 VR 技术到底差在哪?
  9. python类中的内置函数
  10. 【观察】星环科技:走向融合数据云新时代,背后必有强大数据底座