0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

神经元和神经网络层的标准C++定义

C语言专家集中营 来源:未知 作者:伍文辉 2018-04-15 10:40 次阅读

前一段时间做了一个数字识别的小系统,基于BP神经网络算法的,用MFC做的交互。在实现过程中也试着去找一些源码,总体上来讲,这些源码的可移植性都不好,多数将交互部分和核心算法代码杂糅在一起,这样不仅代码阅读困难,而且重要的是核心算法不具备可移植性。设计模式,设计模式的重要性啊!于是自己将BP神经网络的核心算法用标准C++实现,这样可移植性就有保证的,然后在核心算法上实现基于不同GUI库的交互(MFC,QT)是能很快的搭建好系统的。下面边介绍BP算法的原理(请看《数字图像处理与机器视觉》非常适合做工程的伙伴),边给出代码的实现,最后给出基于核心算法构建交互的例子。

人工神经网络的理论基础

1.感知器

感知器是一种具有简单的两种输出的人工神经元,如下图所示。

2.线性单元

只有1和-1两种输出的感知器实际上限制了其处理和分类的能力,下图是一种简单的推广,即不带阈值的感知器。

3.误差准则

使用的是一个常用的误差度量标准,平方误差准则。公式如下。

其中D为训练样本,td为训练观测值d的训练输出,ot为观测值d的实际观测值。如果是个凸函数就好了(搞数学的,一听到凸函数就很高兴,呵呵!),但还是可以用梯度下降的方法求其参数w。

4.梯度下降推导

在高等数学中梯度的概念实际上就是一个方向向量,也就是方向导数最大的方向,也就是说沿着这个方向,函数值的变化速度最快。我们这里是做梯度下降,那么就是沿着梯度的负方向更新参数w的值来快速达到E函数值的最小了。这样梯度下降算法的步骤基本如下:

1)初始化参数w(随机,或其它方法)。

2)求梯度。

3)沿梯度方向更新参数w,可以添加一个学习率,也就是按多大的步子下降。

4)重复1),2),3)直到达到设置的条件(迭代次数,或者E的减小量小于某个阈值)。

梯度的表达式如下:

那么如何求梯度呢?就是复合函数求导的过程,如下:

其中xid为样本中第d个观测值对应的一个输入分量xi。这样,训练过程中参数w的更新表达式如下(其中添加了一个学习率,也就是下降的步长):

于是参数wi的更新增量为:

对于学习率选择的问题,一般较小是能够保证收敛的,看下图吧。

5.增量梯度下降

对于4中的梯度下降算法,其缺点是有时收敛速度慢,如果在误差曲面上存在多个局部极小值,算法不能保证能够找到全局极小值。为了改善这些缺点,提出了增量梯度下降算法。增量梯度下降,与4中的梯度下降的不同之处在于,4中对参数w的更新是根据整个样本中的观测值的误差来计算的,而增量梯度下降算法是根据样本中单个观测值的误差来计算w的更新。

6.梯度检验

这是一个比较实用的内容,如何确定自己的代码就一定没有错呢?因为在求梯度的时候是很容易犯错误的,我就犯过了,嗨,调了两天才找出来,一个数组下表写错了,要是早一点看看斯坦福大学的深度学习基础教程就好了,这里只是截图一部分,有时间去仔细看看吧。

多层神经网络

好了有了前面的基础,我们现在就可以进行实战了,构造多层神经网络。

1.Sigmoid神经元

Sigmoid神经元可由下图表示:

2.神经网络层

一个三层的BP神经网络可由下图表示:

3.神经元和神经网络层的标准C++定义

由2中的三层BP神经网络的示意图中可以看出,隐藏层和输出层是具有类似的结构的。神经元和神经网络层的定义如下:

1

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4574

    浏览量

    98749

原文标题:BP神经网络原理及C++实战

文章出处:【微信号:C_Expert,微信公众号:C语言专家集中营】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    神经网络教程(李亚非)

      第1章 概述  1.1 人工神经网络研究与发展  1.2 生物神经元  1.3 人工神经网络的构成  第2章人工神经网络基本模型  2.1 MP模型  2.2 感知器模型  2.3
    发表于 03-20 11:32

    AI知识科普 | 从无人相信到万人追捧的神经网络

    的过程。2、人工神经网络组成一个典型的神经网络,由成百上千万的人工神经元构成,他们排列在一系列的中,每个之间彼此相连。基本上由三个相互连
    发表于 06-05 10:11

    人工神经网络算法的学习方法与应用实例(pdf彩版)

    `人工神经 网络(Artificial Neural Network,即ANN) 可以概括的定义为:由大量具有适应性的处理元素(神经元)组成的广泛并行互联
    发表于 10-23 16:16

    神经模糊控制在SAW压力传感器温度补偿中的应用

    大量数据的实验验证,本文选取输入有2个神经元,隐含有4个神经元。输出只有1个神经元。采用只
    发表于 10-24 11:36

    基于BP神经网络的手势识别系统

    的振荡发散,本次选取的BP 神经网络是1 个3 BP 网络结构( 含1 个隐),隐单元及输出单元用sigmoid 函数输出,输出共分为10 类,即输出
    发表于 11-13 16:04

    【PYNQ-Z2试用体验】神经网络基础知识

    超过阈值,输出就一跃而起。但我们一般用S函数作为激活函数。如下图:图2 该函数相比阶越函数更加接近现实。神经网络原理如图所示是一个具有两神经网络,每层有两个神经元。 图3 这里两个
    发表于 03-03 22:10

    【案例分享】基于BP算法的前馈神经网络

    期望的输出。BP神经网络算法推导(更新权重和偏倚):从上面推导可以发现:对于任意从神经元i(输出神经元/隐神经元)至
    发表于 07-21 04:00

    【案例分享】ART神经网络与SOM神经网络

    是一种常用的无监督学习策略,在使用改策略时,网络的输出神经元相互竞争,每一时刻只有一个竞争获胜的神经元激活。ART神经网络由比较、识别
    发表于 07-21 04:30

    径向基函数神经网络芯片ZISC78电子资料

    概述:ZISC78是由IBM和Sillicon联合研发的一种具有自学习功能的径向基函数神经网络芯片,它内含78个神经元;并且采用并行结构,运行速度与神经元数量无关;支持RBF/KNN算法;内部可分为若干独立子网...
    发表于 04-07 06:48

    如何构建神经网络

    原文链接:http://tecdat.cn/?p=5725 神经网络是一种基于现有数据创建预测的计算系统。如何构建神经网络神经网络包括:输入:根据现有数据获取输入的
    发表于 07-12 08:02

    有关脉冲神经网络的基本知识

    译者|VincentLee来源 |晓飞的算法工程笔记脉冲神经网络(Spiking neural network, SNN)将脉冲神经元作为计算单...
    发表于 07-26 06:23

    matlab实现神经网络 精选资料分享

    神经神经网络,对于神经网络的实现是如何一直没有具体实现一下:现看到一个简单的神经网络模型用于训练的输入数据:对应的输出数据:我们这里设置:1:节点个数设置:输入
    发表于 08-18 07:25

    基于BP神经网络的PID控制

    最近在学习电机的智能控制,上周学习了基于单神经元的PID控制,这周研究基于BP神经网络的PID控制。神经网络具有任意非线性表达能力,可以通过对系统性能的学习来实现具有最佳组合的PID控制。利用BP
    发表于 09-07 07:43

    卷积神经网络模型发展及应用

    神经网络的思想起源于1943年McCulloch 和 Pitts 提出的神经元模型[19],简称 MCP 神经元模 型。它是利用计算机来模拟人的神经元反应的过 程,具有开创性意义。此
    发表于 08-02 10:39

    卷积神经网络简介:什么是机器学习?

    大量的二维矩阵。为了实现我们的实际分类目标,我们将二维数据转换为长一维向量。转换是在所谓的扁平中完成的,然后是一个或两个完全连接的。最后两类型的神经元类似于图2所示的结构。
    发表于 02-23 20:11