Press "Enter" to skip to content

基于C语言BP神经网络的实现

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

资源下载地址:https://download.csdn.net/download/sheziqiong/85676614

 

资源下载地址:https://download.csdn.net/download/sheziqiong/85676614

 

BP 神经网络的实现

 

实验概述:

 

1.1 课程设计题目:

 

本设计题为 BP 神经网络的实现,主要任务是利用 C++ 语言实现 BP 神经网络, 并利用 BP 神经网络解决螨虫分类问题。

 

1.2 课程设计目的:

 

主要有这些:

 

熟悉自己所学的多种数据结构.

 

理解 BP 神经网络的工作原理

 

利用 C++ 实现 BP 神经网络

 

利用 BP 神经网络实现螨虫分类

 

设定好学习样本个数,取样本个数的训练数据存储于文本文档中,在 C++ main 函数中设定学习效率和步长,读取训练输入和对应的输出进行训练,通过训练得到对应的权值,然后进行数据测试。

 

一、设计功能:

 

本课程设计由 3 个主要功能实现,它们分别为初始化数据,训练和测试螨虫分类是否准确。

 

1.3.3 实验环境与工具:

 

① 操作系统:Windows 企业版 2016 长期服务版;

 

② 开发工具:Visual Studio 2017 社区版;

 

③ 开发语言:C++。

 

实验原理:

 

1.1 结构构成:

 

BP 神经网络是一种根据误差逆向传播的多层前馈网络。其由输入层,隐藏层和输出层构成的。它模拟了人脑的神经网络的结构,众所周知,人大脑传递信息的基本单位是神经元,人脑中有大量的神经元,每个神经元与多个神经元相连接,就是这样,构成了人的大脑。人的大脑的神经网络传播是按照一定的规律,不是神经元会对所有传过来的刺激进行反应。首先是积累刺激,而 BP 神经网络,类似于上述,是一种简化的生物模型。每层神经网络都是由神经元构成的,单独的每个神经元相当于一个感知器。输入层是单层结构的,输出层也是单层结构的,而隐藏层可以有多层,也可以是单层的。输入层、隐藏层、输出层之间的神经元都是相互连接的,为全连接。总得来说,BP 神经网络结构就是,输入层得到刺激后,会把他传给隐藏层,至于隐藏层,则会根据神经元相互联系的权重并根据规则把这个刺激传给输出层,输出层对比结果,如果不对,则返回进行调整神经元相互联系的权值。这样就可以进行训练,最终学会,这就是 BP 神经网络模型。

 

1.2 算法流程:

 

① 先把统一处理过的训练样本输入到 BP 神经网络。

 

② 设定步长,学习效率,最大学习次数,生成初始权值,阈值。

 

③ 计算从输入层开始到输出层结束的各层的输入输出值。

 

④ 计算输出层的误差,如果误差小于设定误差,便结束。如果大于设定误差,便调整权值和阈值,执行步骤 ③。

 

1.3 数学原理:

 

在三层 BP 神经网络中,输入向量,也就是输入层神经元为:

 

 

(1)

 

隐藏层输入向量,也就是隐藏层神经元:

 

(4)

 

输入层到隐藏层之间的权值用数学向量可以表示为

 

 

(5)

 

这里面的列向量

 

 

为隐藏层第 j 个神经元对应的权重;隐藏层到输出层之间的权值用数学向量可以表示为:

 

(6)

 

式(6)中的列向量

 

 

为输出层第 k 个神经元对应的权重。

 

输入层,隐藏层,输出层之间的数学关系如下所示:

 

就输出层而言

 

 

在上述表达式中,激活函数 f(x)必须为单调函数,我们选取 sigmoid 函数:

 

(11)

 

由于 f(x)是连续函数,是可导函数,且

 

 

这些就构成了 BP 神经网络的输入层,输出层和隐藏层。

 

如果 BP 网络的输出结果和期望输出结果不一致时,那幺便有了输出误差 E,表达式如下:

 

(12)

 

展开到隐藏层,则有如下表达式:

 

 

(11)

 

展开到输入层,则有以下表达式:

 

(13)

 

根据这些,我们可以明白,BP 神经网络的输入误差产生是由于输出层到隐藏层的权值和隐藏层到输入层的权值决定,因此调整输出层到隐藏层的权值和隐藏层到输入层的权值可以改变误差 E。

 

显而易见的,调整输出层到隐藏层的权值和隐藏层到输入层的权值的思想是让这个误差不断缩小这样才能满足我们的要求,因此我们需要让这些权值修改量与误差 E 的负梯度下降量成正比,也就是如下表达式:

 

 

二、算法分析:

 

设输入层神经元数量为 n1,隐藏层神经元数量为 n2,输出层神经元数量为 n3。对于一个测试样本进行前馈计算,则需要进行两次矩阵运算,两次向量和矩阵相乘分别,需要进行 n1 * n2 和 n2 * n3 次计算,由于输入层神经元数量和输出层神经元数量是固定的,只有中间隐藏层的神经元数量是需要自己设定的,因此本算法时间复杂度为 O(n1 * n2 + n2 * n3) = O(n2)。

 

对于训练一个神经网络而言,有 k 个样本,每个样本只会被训练一次,所以训练一个神经网络的时间复杂度为 O(k*n2),同理,预测一个样本,时间复杂度是 O(n2)。

 

对于时间复杂度,因 n1 和 n3 是固定的,即输入层与输出层神经元数量恒定,故仅相关于隐藏层神经元数量, 亦即 O(n2)。又在 n1 和 n3 恒定时,仅有 n2 随输入而波动,可知算法的一系列操作可在 O(1)的空间上完成。

 

为了加强鲁棒性,在满足精度要求的前提下,取尽可能少的隐层节点数,即本课程设计中的 15 个节点。

 

三、总结:

 

① 首先是对隐藏层节点数目的考虑,过多或者过少都不能科学地反映出样本的规律性。如果数量太少,则不能够将训练数据的规律性概括出来。如果数量过多,也不是很好,因为可能会把一些干扰性的并不是规律的内容给记录下来,这样会使得过于准确导致某些数据还是判断失误,而且会使得训练时间变长很多。比较妥当的一个做法就是根据公式计算出一个初始的实验值。

 

② 至于究竟是选取每输入一个样本就进行权值调整,然后计算误差,或者是输入完所有样本数据之后再进行权值调整,根据本次实验,我得出的结论是如果样本数量多的话,输入完所有样本数据之后再进行权值调整的话能更快得进行收敛.

 

③ 这次课程设计在 Visual Studio 2017(community)完成了 BP 神经网络实现的编程,明白了 BP 神经网络计算过程分两步,分别是正向计算,反向计算。对于正向传播而言,计算从输入层开始到输出层结束的各层的输入输出值,对于反向传播,便是如果正向计算的输出值不满足预期,便从后往前调整权值,直至最后的数据符合预期要求。

 

④ 通过本次实验,对 BP 神经网络理解变得非常透彻,熟悉了 BP 神经网络的结构,对人工智能的应用有了一定的认识,也对数据结构的学习印象更深刻,提高了我学习相关知识的兴趣,期间遇到了很多困难,而且编程的实现对我而言比较繁琐,遇到了很多 BUG,但是都一一细心解决了。

 

⑤ 通过熟悉其数学原理,我深刻理解到了 BP 神经网络已经非常成熟。它的优点是可以解决非线性映射问题。它的网络结构也非常灵活。输入层,输出层和隐藏层的神经元数量可以根据具体的需要而设定。但是它的缺点也存在,比如说它的学习速度比较慢,就本课程设计而言,学了较大次数才能收敛,而且对于初始参数的设定而言,得不到很多的理论指导。

 

资源下载地址:https://download.csdn.net/download/sheziqiong/85676614

 

资源下载地址:https://download.csdn.net/download/sheziqiong/85676614

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。