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

    文章

    4765

    浏览量

    100561

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

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

收藏 人收藏

    评论

    相关推荐

    神经网络教程(李亚非)

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

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

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

    基于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

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

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

    基于BP神经网络的PID控制

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

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

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

    卷积神经网络和深度神经网络的优缺点 卷积神经网络和深度神经网络的区别

    深度神经网络是一种基于神经网络的机器学习算法,其主要特点是由多层神经元构成,可以根据数据自动调整神经元之间的权重,从而实现对大规模数据进行预测和分类。卷积
    发表于 08-21 17:07 3942次阅读

    神经元神经网络的区别与联系

    在人工智能和机器学习的领域中,神经元神经网络是两个至关重要的概念。虽然它们都与人脑中的神经系统有着密切的联系,但在实际应用和理论研究中,它们各自扮演着不同的角色。本文旨在深入探讨神经元
    的头像 发表于 07-01 11:50 822次阅读

    反向传播神经网络分为多少

    的层数可以根据具体问题和数据集来确定,但通常包括输入、隐藏和输出。 输入 输入是BP神经网络
    的头像 发表于 07-03 11:02 387次阅读

    bp神经网络算法过程包括

    的算法过程,包括网络结构、激活函数、训练过程、反向传播算法、权重更新策略等。 网络结构 BP神经网络由输入、隐藏和输出
    的头像 发表于 07-04 09:45 378次阅读

    如何构建三bp神经网络模型

    能力。本文将介绍如何构建三BP神经网络模型。 神经网络基础知识 2.1 神经元模型 神经元神经网络
    的头像 发表于 07-11 10:55 385次阅读

    神经网络结构的作用是什么

    的三结构是最基本的神经网络结构,包括输入、隐藏和输出。下面介绍神经网络
    的头像 发表于 07-11 11:03 681次阅读