♻️ 资源大小2.28MB➡️资源下载https://download.csdn.net/download/s1t16/87450303BP 神经网络的实现实验概述1.1 课程设计题目本设计题为 BP 神经网络的实现主要任务是利用 C 语言实现 BP 神经网络 并利用 BP 神经网络解决螨虫分类问题。1.2 课程设计目的主要有这些熟悉自己所学的多种数据结构.理解 BP 神经网络的工作原理利用 C 实现 BP 神经网络利用 BP 神经网络实现螨虫分类设定好学习样本个数取样本个数的训练数据存储于文本文档中在 C main 函数中设定学习效率和步长读取训练输入和对应的输出进行训练通过训练得到对应的权值然后进行数据测试。一、设计功能本课程设计由 3 个主要功能实现它们分别为初始化数据训练和测试螨虫分类是否准确。① 初始化数据srand( (unsigned)time( NULL ) ); for( int i 0; i HN; i ) { for( int j 0; j INnum; j ) { W[i][j] double( rand() % 100 ) / 100; //初始化输入层到隐层的权值 } } for( int ii 0; ii ONnum; ii ) { for( int jj 0; jj HN; jj ) { V[ii][jj] double( rand() % 100 ) / 100; //初始化隐层到输出层的权值ֵ } }这段代码是为了初始化输入层到隐层的权值以及隐层到输出层的权值。input_sample(int m)这段代码是为了初始化训练数据的输入值。output_sample(int m)这个函数是为了初始化数据对应的输出值② 训练本功能主要是逐步训练直至收敛。calculate_HIDDEN_OUTPUT():本函数主要用于求隐层输出。calculate_OUTPUT_OUTPUT()本函数主要用于求输出层输出。inaccuracy_Output_Hidden(int m);本函数主要用于求解输出层到隐层的一般化误差inaccuracy_Hidden_Input()本函数主要用于求解隐层到输入层的一般化误差。update_Output_Hidden本函数主要是用于调整输出层至隐层的权值。update_Hidden_Input本函数主要是用于调整隐层至输入层的权值。 saveWeight()本函数主要是用于保存计算出来的权值。③ 测试分类是否准确数据结构:struct { double input[INnum]; double teach[ONnum]; }Study_Data[SampleCount];代表了训练样本double Weight_Input[NUM_HIDDEN][mInputNode];代表了输入层至隐藏层权值double Weight_Output[mOutPutNode][NUM_HIDDEN];代表了隐层至输出层权值double Sample_Input[mInputNode];代表了单个样本输入数据double Sample_Output[mOutPutNode];代表了单个样本期望输出值double ORIGIN_W[NUM_HIDDEN][mInputNode];代表了隐藏层到输入层的旧权数组double ORIGIN_V[mOutPutNode][NUM_HIDDEN];代表了输出层到隐藏层的旧权数组double HIDDEN_INPUT[NUM_HIDDEN];代表了隐层的输入double OUTPUT_INPUT[mOutPutNode];代表了输出层的输入double hidenLayerOutput[NUM_HIDDEN];代表了隐层的输出double OUTPUT_OUTPUT[mOutPutNode];代表了输出层的输出double inaccuracy_sample[SampleCount];代表了第 m 个样本的总误差。1.3.3 实验环境与工具① 操作系统Windows 企业版 2016 长期服务版② 开发工具Visual Studio 2017 社区版③ 开发语言C。实验原理1.1 结构构成BP 神经网络是一种根据误差逆向传播的多层前馈网络。其由输入层隐藏层和输出层构成的。它模拟了人脑的神经网络的结构众所周知人大脑传递信息的基本单位是神经元人脑中有大量的神经元每个神经元与多个神经元相连接就是这样构成了人的大脑。人的大脑的神经网络传播是按照一定的规律不是神经元会对所有传过来的刺激进行反应。首先是积累刺激而 BP 神经网络类似于上述是一种简化的生物模型。每层神经网络都是由神经元构成的单独的每个神经元相当于一个感知器。输入层是单层结构的输出层也是单层结构的而隐藏层可以有多层也可以是单层的。输入层、隐藏层、输出层之间的神经元都是相互连接的为全连接。总得来说BP 神经网络结构就是输入层得到刺激后会把他传给隐藏层至于隐藏层则会根据神经元相互联系的权重并根据规则把这个刺激传给输出层输出层对比结果如果不对则返回进行调整神经元相互联系的权值。这样就可以进行训练最终学会这就是 BP 神经网络模型。1.2 算法流程① 先把统一处理过的训练样本输入到 BP 神经网络。② 设定步长学习效率最大学习次数生成初始权值阈值。③ 计算从输入层开始到输出层结束的各层的输入输出值。④ 计算输出层的误差如果误差小于设定误差便结束。如果大于设定误差便调整权值和阈值执行步骤 ③。1.3 数学原理在三层 BP 神经网络中输入向量,也就是输入层神经元为1隐藏层输入向量也就是隐藏层神经元2输出层输出向量也就是输出层神经元3期望输出向量可以表示为4输入层到隐藏层之间的权值用数学向量可以表示为5这里面的列向量为隐藏层第 j 个神经元对应的权重隐藏层到输出层之间的权值用数学向量可以表示为6式6中的列向量为输出层第 k 个神经元对应的权重。输入层隐藏层输出层之间的数学关系如下所示就输出层而言就隐藏层而言在上述表达式中激活函数 f(x)必须为单调函数我们选取 sigmoid 函数11由于 f(x)是连续函数是可导函数且这些就构成了 BP 神经网络的输入层输出层和隐藏层。如果 BP 网络的输出结果和期望输出结果不一致时那么便有了输出误差 E表达式如下12展开到隐藏层则有如下表达式11展开到输入层则有以下表达式13根据这些我们可以明白BP 神经网络的输入误差产生是由于输出层到隐藏层的权值和隐藏层到输入层的权值决定因此调整输出层到隐藏层的权值和隐藏层到输入层的权值可以改变误差 E。显而易见的调整输出层到隐藏层的权值和隐藏层到输入层的权值的思想是让这个误差不断缩小这样才能满足我们的要求因此我们需要让这些权值修改量与误差 E 的负梯度下降量成正比也就是如下表达式式14、15中常数反映了学习效率。综上所述通过数学原理可以看出在 BP 学习算法中输入层输出层和隐藏层权值调整方式都是一样的。由三个条件决定它们分别是学习效率输入层输出层和隐藏层的各层误差信号和各层输入信号 X/Y。其中最为重要的是输出层误差信号它直接意味着和实际期望结果的差异代表着与我们预期结果的差距而前面的各层的误差都是从后往前传递计算的误差。实验结果输入初始参数:正在训练:训练成功测试数据值得一提的是本次课程设计仍然存在一定的不足。本次课程设计中采用的学习效率是一个定值没有发生过改变。这样的话在某些地方用函数逼近的时候出现了一些误差。所以如果能够将这个学习效率能够自动调整在一开始是一个数值比较大的学习效率这样可以更快速地接近理想函数等到快接近理想函数的时候这个时候的话采用较小的学习效率这样可以使最后的函数更加准确这样的话训练时间会缩短并且训练的效果会更佳。实验一开始采取的参数不是很合适采取了较大的学习效率这样导致训练失败了一开始采取的训练次数也较低最后的结果也是训练失败因此学习效率和步长都不可以太大如果太大波动也大了这样的话发散的概率提高了太多。学习效率和步长也不可以过小如果过小训练时间会很长影响性能。然后预定误差对实验的进行影响也比较大如果预定误差值过小则实验最后的效果会出现较大的偏差如果预定误差值较大则训练次数和时间会过大。所以在本次实验中一定要把握好参数的设定否则结果会很差。二、算法分析设输入层神经元数量为 n1隐藏层神经元数量为 n2输出层神经元数量为 n3。对于一个测试样本进行前馈计算则需要进行两次矩阵运算两次向量和矩阵相乘分别需要进行 n1n2 和 n2n3 次计算由于输入层神经元数量和输出层神经元数量是固定的只有中间隐藏层的神经元数量是需要自己设定的因此本算法时间复杂度为 O(n1n2 n2n3) O(n2)。对于训练一个神经网络而言有 k 个样本每个样本只会被训练一次所以训练一个神经网络的时间复杂度为 O(k*n2)同理预测一个样本时间复杂度是 O(n2)。对于时间复杂度因 n1 和 n3 是固定的即输入层与输出层神经元数量恒定故仅相关于隐藏层神经元数量 亦即 O(n2)。又在 n1 和 n3 恒定时仅有 n2 随输入而波动可知算法的一系列操作可在 O(1)的空间上完成。为了加强鲁棒性在满足精度要求的前提下取尽可能少的隐层节点数即本课程设计中的 15 个节点。三、总结① 首先是对隐藏层节点数目的考虑过多或者过少都不能科学地反映出样本的规律性。如果数量太少则不能够将训练数据的规律性概括出来。如果数量过多也不是很好因为可能会把一些干扰性的并不是规律的内容给记录下来这样会使得过于准确导致某些数据还是判断失误而且会使得训练时间变长很多。比较妥当的一个做法就是根据公式计算出一个初始的实验值。② 至于究竟是选取每输入一个样本就进行权值调整,然后计算误差,或者是输入完所有样本数据之后再进行权值调整根据本次实验我得出的结论是如果样本数量多的话输入完所有样本数据之后再进行权值调整的话能更快得进行收敛.③ 这次课程设计在 Visual Studio 2017community完成了 BP 神经网络实现的编程明白了 BP 神经网络计算过程分两步分别是正向计算反向计算。对于正向传播而言计算从输入层开始到输出层结束的各层的输入输出值对于反向传播便是如果正向计算的输出值不满足预期便从后往前调整权值直至最后的数据符合预期要求。④ 通过本次实验对 BP 神经网络理解变得非常透彻熟悉了 BP 神经网络的结构对人工智能的应用有了一定的认识也对数据结构的学习印象更深刻提高了我学习相关知识的兴趣期间遇到了很多困难而且编程的实现对我而言比较繁琐遇到了很多 BUG但是都一一细心解决了。⑤ 通过熟悉其数学原理我深刻理解到了 BP 神经网络已经非常成熟。它的优点是可以解决非线性映射问题。它的网络结构也非常灵活。输入层输出层和隐藏层的神经元数量可以根据具体的需要而设定。但是它的缺点也存在比如说它的学习速度比较慢就本课程设计而言学了较大次数才能收敛而且对于初始参数的设定而言得不到很多的理论指导。