人工智能技术导论(微课版)课件 第四章 人工神经网络算法介绍_第1页
人工智能技术导论(微课版)课件 第四章 人工神经网络算法介绍_第2页
人工智能技术导论(微课版)课件 第四章 人工神经网络算法介绍_第3页
人工智能技术导论(微课版)课件 第四章 人工神经网络算法介绍_第4页
人工智能技术导论(微课版)课件 第四章 人工神经网络算法介绍_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章

人工神经网络算法介绍学习目标

掌握人工神经元、人工神经网络的概念。

掌握人工神经网络分类。

掌握Neurolab安装。

掌握感知机的运行原理和案例编程。

掌握BP神经网络的结构和案例编程。

掌握DHNN的运行步骤和Hopfield神经网络案例编程。4.1人工神经网络简介4.2神经网络编程环境搭建4.3感知机4.4典型前馈神经网络:BP神经网络4.5典型反馈神经网络:Hopfield神经网络4.1

人工神经网络简介4.1.1生物神经元和生物神经网络

人工神经网络是一种模仿生物神经网络结构和功能的计算模型。生物神经网络由大量生物神经元组成。生物神经元由细胞体、树突、轴突、突触等构成。细胞体主要功能是接收和整合输入信息并传出信息。树突用于接收其他神经元轴突传来的信号并传给细胞体。轴突的功能是把树突和细胞体表面传入细胞体的信号传递给末端的突触,再由突触传给与该神经元相连的其他神经元。信号以电脉冲形式传递。4.1.1生物神经元和生物神经网络

在信号的传递过程中,信号的输入并不一定会输出信号,这取决于输入信号的电脉冲强度。当输入的电脉冲使细胞膜电位升高并超过阈值时,细胞才会进入兴奋状态,产生动作电位并由轴突输出。细胞输出动作电位后不会立即对下一个输入的信号产生响应,而需要等待一小段时间。在等待了一段时间后,如果输入的信号的电脉冲强度能够使细胞进入兴奋状态,细胞才会继续输出动作电位。依靠生物神经网络,生物体才能进行各种活动。

生物神经网络拥有以下3个特征。(1)并行处理:对于外部刺激,生物神经网络内神经细胞可以同时响应。(2)分层结构:神经细胞之间分层组网,按层次构成生物神经网络。(3)功能特异性:实现不同功能的生物神经网络在组网结构上具有差异性。4.1.2人工神经元

人工神经元是一个多输入、单输出的非线性数据处理模型。其中,负责输入数据的部分类似于生物神经元的树突,负责计算过程的部分类似于生物神经元的细胞体,负责输出数据的部分类似于生物神经元的轴突。如果输入数据的强度(各个分量的加权总和)超过了阈值,则人工神经元被激活,对输入数据进行非线性计算。否则,人工神经元不被激活,处于抑制状态。因此人工神经元适用于解决二分类问题。4.1.3人工神经网络的概念

生物神经网络是由很多个生物神经元组网形成。类似地,很多个人工神经元组网形成人工神经网络。

在人工神经网络中,每个人工神经元通过一种特定的输出函数进行计算,这些函数称为激活函数。每两个神经元间的连接都代表前一个人工神经元输出对后一个人工神经元输入信号加权,称为权重。人工神经网络的输出结果受输入数据、人工神经网络的结构、人工神经元的连接方式、权重参数和激活函数的影响。在人工神经网络中,人工神经元可以表示不同的对象(如特征、字母、概念)或者一些有意义的抽象模式。

人工神经网络的特点。

1.非线性全局性

人工神经网络的整体性能不是局部性能的简单叠加,而是表现出集体行为特征。

2.并行性

人工神经网络的结构与人脑的类似,它由许多处理单元并联组合而成,即在结构上具有并行性。同时人工神经网络的计算也是并行的,在同一层内的所有处理单元同时操作,即在计算上具有并行性。4.1.3人工神经网络的概念

生物神经网络是由很多个生物神经元组网形成。类似地,很多个人工神经元组网形成人工神经网络。

在人工神经网络中,每个人工神经元通过一种特定的输出函数进行计算,这些函数称为激活函数。每两个神经元间的连接都代表前一个人工神经元输出对后一个人工神经元输入信号加权,称为权重。人工神经网络的输出结果受输入数据、人工神经网络的结构、人工神经元的连接方式、权重参数和激活函数的影响。在人工神经网络中,人工神经元可以表示不同的对象(如特征、字母、概念)或者一些有意义的抽象模式。

人工神经网络的特点。

1.非线性全局性

人工神经网络的整体性能不是局部性能的简单叠加,而是表现出集体行为特征。

2.并行性

人工神经网络的结构与人脑的类似,它由许多处理单元并联组合而成,即在结构上具有并行性。同时人工神经网络的计算也是并行的,在同一层内的所有处理单元同时操作,即在计算上具有并行性。4.1.3人工神经网络的概念

3.知识分布式存储

人工神经网络采用分布式存储知识,通过训练和学习,特征被准确地记忆在网络的连接权值上,当同样的数据再次输入时就可以进行快速判断。

4.良好的泛化能力和容错性

人工神经网络可以从有噪声干扰或者不完整的数据中进行学习,具有良好的泛化能力和容错性。这一特点让人工神经网络在图像复原、语音处理、模式识别与分类等方面具有重要的应用价值。

5.非凸性

人工神经网络的演化方向在一定条件下取决于某个特定的状态函数(如能量函数)。当能量函数取极值时,该网络将处在比较稳定的状态。非凸性是指这种函数有多个极值点,因此该网络会存在多个相对稳定的平衡态,从而导致人工神经网络演化的多样性。4.1.3人工神经网络的概念

一般的人工神经网络主要由3层构成,分别是输入层、隐藏层和输出层。输入层负责从外部环境接收信息,它包含多个输入单元,用于接收输入样本中各种不同的特征信息。输入层不完成任何计算,只传递信息给下一层。隐藏层介于输入层和输出层之间,主要负责计算与分析。输出层负责生成最终结果,它包含多个输出单元,每个输出单元对应某一种特定的分类,输出结果给外部环境。4.1.3人工神经网络的概念

人工神经网络的使用过程。1.明确需求

明确输入数据是什么,输出结果是什么。

2.算法选择

选择一种或几种人工神经网络算法,构造人工神经网络模型。3.模型训练

输入带标签的训练数据,通过算法优化权重参数和阈值,使其达到最优值。在构造人工神经网络模型时,人工神经元的激活函数就已经确定了。如果想要改变人工神经网络的输出,只能调整权重参数和阈值。

4.未知数据预测

输入未知数据,让人工神经网络模型进行预测。4.1.3人工神经网络的概念

人工神经网络运行流程。(1)选择人工神经网络模型,并初始化权重参数。(2)针对选择的模型,输入数据。(3)人工神经网络模型内部通过多层人工神经元处理输入数据,对数据进行迭代计算、提取特征。(4)人工神经网络模型的输出层计算损失值(输出值与目标值之间的误差)。(5)将损失值反向传播到人工神经网络中间各层人工神经元中。(6)人工神经网络中间各层人工神经元对损失值进行学习,更新自己的权重参数。(7)重复步骤(3)~(6),直到损失值收敛为某个微小值或达到最大迭代次数,结束运行。4.1.4人工神经网络的分类

人工神经网络有多种分类方法,常见的分类是按拓扑结构分类,可分为前馈神经网络和反馈神经网络;也可以按网络性能分类,分为连续型神经网络和离散型神经网络,或确定型神经和随机型神经网络;还可以按学习方法分类,分为监督学习神经网络、半监督学习神经网络和无监督学习神经网络。1.前馈神经网络

前馈神经网络(FeedforwardNeuralNetwork)是一种比较简单的人工神经网络。它采用单向多层结构,各神经元分层排列,各层神经元只和前一层神经元相连并接收来自前一层神经元的输入,经过计算后输出到后一层神经元。前馈神经网络中没有反馈,信号从输入层向输出层单向传播,可以用一个有向无环图表示。第一层叫输入层,最后一层叫输出层,其他中间层叫作隐藏层(隐层)。隐藏层可以没有,也可以有多层。4.1.4人工神经网络的分类

前馈神经网络又分为单层前馈神经网络和多层前馈神经网络。

单层前馈神经网络是最简单的人工神经网络之一,它只包含输入层和输出层,没有隐藏层,输出值通过输入值乘权重值得到。单层前馈神经网络的典型代表有单层感知机。单层感知机可以看作线性分类器,大部分线性分类和回归问题都可以用单层感知机解决。

多层前馈神经网络包含一层输入层、一层或多层隐藏层以及一层输出层。在每一层中,数据的特征被一步步地抽象出来,下一层直接使用上一层抽象的特征进行进一步的线性组合。网络具有更好的表达效果,可以处理非线性问题。4.1.4人工神经网络的分类

常见的前馈神经网络有感知机、BP神经网络、RBF神经网络等。

(1)感知机

感知机(又称感知器)是最简单的前馈神经网络之一,它主要用于模式分类,也可用于基于模式分类的学习控制和多模态控制。感知机可分为单层感知机和多层感知机。单层感知机用于解决线性分类和回归问题,要解决非线性分类问题需要考虑使用多层感知机。

(2)BP神经网络BP神经网络是指在权重参数调整方面采用了BP算法的前馈神经网络。与感知机不同的是,BP神经网络采用Sigmoid函数作为激活函数,因此输出是0~1的连续值,可实现从输入到输出的任意非线性映射。在实际情况中,BP神经网络的运用非常广泛。

(3)RBF神经网络RBF神经网络是隐藏层由RBF神经元组成的前馈神经网络。RBF神经元是指变换函数为RBF的神经元。典型的RBF神经网络由3层组成:一层输入层,一层或多层由RBF神经元组成的RBF层(隐藏层)和一层由线性神经元组成的输出层。4.1.4人工神经网络的分类

2.反馈神经网络

反馈神经网络(FeedbackNeuralNetwork,FNN)是一种从输出层到输入层具有反馈连接的人工神经网络,其结构要比前馈神经网络的复杂得多。反馈神经网络在训练样本时,每个神经元将自身的输出信号经过一步时移作为输入信号反馈给其他神经元。其他神经元在得到输入后,产生状态变化并产生输出反馈给与之相连的神经元。整个网络在不断输入的反馈下,各神经元的状态不断变化,如果这个网络是收敛的,那么这种变化会越来越小,最后网络趋于稳定,此时网络会产生稳定的输出。这种情况下,可以认为网络训练完毕,可以获取网络稳定时的权重参数来建立模型。4.1.4人工神经网络的分类

常见的反馈神经网络有Hopfield神经网络、Elman神经网络等。(1)Hopfield神经网络Hopfield神经网络由美国物理学家约翰·霍普菲尔德(JohnHopfied)在1982年提出。他将物理学中的动力学思想引入人工神经网络的构造中,从而形成了Hopfield神经网络。Hopfield神经网络是一种单层反馈神经网络,从输出层到输入层均有反馈连接,每一个神经元跟所有其他神经元相互连接,又称为全互联网络。Hopfield神经网络是目前运用较为广泛的反馈神经网络,它具有联想记忆和解决快速寻优问题的能力。

(2)Elman神经网络Elman神经网络是杰弗里·L·埃尔曼(JeffreyL.Elman)于1990年针对语音处理问题提出的一种人工神经网络,是一种典型的多层局部回归网络。Elman神经网络基于BP神经网络进行了改进。在BP神经网络基本结构的基础上,Elman神经网络在隐藏层中增加了一个承接层,作为一个延时算子,使网络具备了记忆功能,能够适应时间变化,稳定性大大增强。Elman神经网络的应用也非常广泛,它比前馈神经网络具有更强的计算能力,可以用来解决快速寻优问题。4.1.4人工神经网络的分类

前馈神经网络与反馈神经网络的异同点。(1)时序处理差异:前馈神经网络一般不考虑输出与输入在时间上的滞后效应,只表达输出与输入的映射关系,结构简单,易于进行系统分析。而反馈神经网络要考虑输出与输入在时间上的延迟,其结构比前馈神经网络的更复杂。(2)学习机制差异:前馈神经网络(如BP网络)学习的过程中主要采用误差修正法(如BP算法),计算速度和收敛速度慢。而反馈神经网络主要采用Hebb学习规则,计算速度和收敛速度比大部分前馈神经网络的要快。(3)应用领域共性:反馈神经网络和前馈神经网络都可以应用于联想记忆、分类、优化计算等任务,反馈神经网络在优化计算任务上更具优势。4.2神经网络编程环境搭建4.2.1pandas库的安装

打开虚拟机,在命令行终端输入命令pip3installpandas,安装pandas。等待一段时间后,pandas安装完成。

安装完成后,可以测试一下pandas是否安装成功。执行命令python3后,再执行代码importpandas导入pandas。如果没有出现错误信息,则说明pandas安装成功。4.2.2Neurolab库的安装Neurolab是基于Python的人工神经网络库,包括基本神经网络和训练算法,利用Neurolab可构建各种类型的神经网络。在命令行终端输入命令pip3installneurolab,安装Neurolab。等待一段时间后,Neurolab安装完成。

安装完成后,可以测试一下Neurolab是否安装成功。执行命令python3后,再执行代码importneurolab导入Neurolab。如果没有出现错误信息,则说明Neurolab安装成功。4.3感知机4.3.1感知机简介

感知机是早期的神经网络,可以分为单层感知机和多层感知机。单层感知机由两层神经元组成,仅包含输入层和输出层,输入层和输出层直接相连。输入层包括若干个输入单元,输入单元不进行任何计算,只负责数据传输。输出层包括若干个输出单元,输出单元对接收到的数据进行并行计算后输出结果。4.3.1感知机简介

单层感知机由以下几部分组成。(1)输入

。(2)权重

,对于每一个输入,会有一个权重与之对应,用来控制结果。(3)偏置,即

。(4)激活函数θ,θ一般为阶跃函数。当加权和小于或等于0时,输出0;当加权和大于0时,输出1。

单层感知机的运行原理为:让输入向量的各个分量

分别乘各自的权重

,然后与偏置项

相加,将相加结果输入激活函数,由激活函数判断后输出结果。输出可以表示为:

可以看出这个方程是一个线性方程,所以单层感知机只能用于处理线性可分问题,如果样本数据非线性可分,则单层感知机不适用。4.3.1感知机简介

在使用中,单层感知机的偏置和权重的最优取值都是通过训练自动获取的。单层感知机的训练规则为梯度下降法,训练步骤如下。(1)设定单层感知机的初始权重和偏置,输入样本数据。(2)计算实际输出和目标输出之间的误差,若误差较大,则根据设定的学习率(权重和偏置每次调整的幅度)调整权重和偏置。(3)重复步骤(2)。当满足一定的误差要求或者达到最大迭代次数时,训练结束。4.3.2感知机案例编程

1.编写单层感知机实现“与”“或”计算

首先从理论上评估一下“与”,“或”计算是否可以用单层感知机来实现。分析“与”,“或”的计算规则,并绘制计算规则的数据点分布。

可以看出,“与”,“或”计算都可以转化为线性分类问题,即能够找到一条直线对数据点进行分类。若数据点落在直线下方,则分类结果为0;若数据点落在直线上方,则分类结果为1。因此,“与”,“或”计算可以用单层感知机来实现。4.3.2感知机案例编程

编写代码实现单层感知机,先设置输入数据的个数和激活函数,以及初始权重和偏置。然后分别定义训练、预测及更新权重和偏置的方法。训练时采用一次迭代训练所有数据的方法,迭代次数设置为20,学习率设置为0.1。每次迭代后,计算误差并更新权重和偏置。训练完毕后,利用训练好的单层感知机进行预测。classPerceptron(object):

def__init__(self,num,activator):#初始化感知机

self.activator=activator

#使用的激活函数

self.weights=[0.0for_inrange(num)]#权重向量初始化为0

self.bias=0#偏置项初始化为0

def__str__(self):#返回感知机的权重和偏置的字符串表示

return'weight:%s\n

bias:%f\n'%(self.weights,self.bias)

deftrain(self,input_vecs,labels,iterations,rate):#训练感知机

for_inrange(iterations):

self._one_iteration(input_vecs,labels,rate)

def_one_iteration(self,input_vecs,labels,rate):#

单次迭代训练

samples=zip(input_vecs,labels)#将输入和标签配对

forinput_vec,labelinsamples:

output=self.predict(input_vec)#计算当前预测值

self._update_weights(input_vec,output,label,rate)#更新权重

4.3.2感知机案例编程

def_update_weights(self,input_vec,output,label,rate):

#根据预测误差更新权重

delta=label-output

self.weights=list(

map(

lambdax,y:x+y*rate*delta,

self.weights,input_vec

)

)

self.bias+=rate*delta#更新偏置

defpredict(self,input_vec):#预测输入向量的输出

weighted_sum=sum(w*xforw,xinzip(self.weights,input_vec))+self.bias

returnself.activator(weighted_sum)#定义激活函数defactivate(x):ifx>0:return1return0#构建and训练与数据defget_train_dataset_and():input_vecs=[[0,0],[0,1],[1,0],[1,1]]#and的训练数据labels=[0,0,0,1]#and的标签returninput_vecs,labels#构建or训练或数据defget_train_dataset_or():input_vecs=[[0,0],[0,1],[1,0],[1,1]]#o的训练数据labels=[0,1,1,1]#or的标签returninput_vecs,labels

4.3.2感知机案例编程

defactivate(x): #定义阶跃激活函数ifx>0:return1return0defget_train_dataset_and(): #获取and运算的训练数据input_vecs=[[0,0],[0,1],[1,0],[1,1]]#所有可能的输入组合labels=[0,0,0,1] #and运算的真值表returninput_vecs,labelsdefget_train_dataset_or(): #获取or运算的训练数据input_vecs=[[0,0],[0,1],[1,0],[1,1]]#所有可能的输入组合labels=[0,1,1,1] #or运算的真值表returninput_vecs,labelsdeftrain_data_and(): #训练and感知机perceptron_and=Perceptron(2,activate)input_vecs,labels=get_train_dataset_and()perceptron_and.train(input_vecs,labels,20,0.1) #迭代20次,学习速率为0.1returnperceptron_anddeftrain_data_or(): #训练or感知机perceptron_or=Perceptron(2,activate)input_vecs,labels=get_train_dataset_or()perceptron_or.train(input_vecs,labels,20,0.1) #迭代20次,学习速率为0.1returnperceptron_or4.3.2感知机案例编程

if__name__=='__main__': #测试and感知机and_perception=train_data_and()print(and_perception)print('1and1=%d'%and_perception.predict([1,1]))print('0and0=%d'%and_perception.predict([0,0]))print('1and0=%d'%and_perception.predict([1,0]))print('0and1=%d'%and_perception.predict([0,1]))#测试or感知机or_perception=train_data_or()print(or_perception)print(f'1or1={or_perceptron.predict([1,1])}')print(f'0or0={or_perceptron.predict([0,0])}')print(f'1or0={or_perceptron.predict([1,0])}')print(f'0or1={or_perceptron.predict([0,1])}')

运行结果:4.3.2感知机案例编程2.利用Neurolab提供的单层感知机实现“与”计算Neurolab提供了现成的方法可以直接创建单层感知机。下面创建并调用该单层感知机实现“与”计算。importneurolabasnlimportpylabaspl#构造训练数据input=[[0,0],[0,1],[1,0],[1,1]]target=[[0],[0],[0],[1]]

#创建单层感知机模型net=.newp([[0,1],[0,1]],1)#训练模型error=net.train(input,target,epochs=100,show=10,lr=0.1)#使用训练好的模型进行预测out=net.sim(input)print(out)#绘制训练误差随迭代次数的变化pl.plot(error)pl.xlabel('Epochnumber')pl.ylabel('Trainerror')pl.grid()pl.show()4.3.2感知机案例编程

运行结果:

单层感知机无法实现“异或”计算,在二维平面中无法找到一条直线,让直线上方和下方的数据点分属两类。4.4典型前馈神经网络:BP神经网络4.4.1BP神经网络简介

BP神经网络是运用最广泛的神经网络之一。

因为单层神经网络(如单层感知机等)无法解决非线性分类问题(如“异或”计算等),运用场景受限。所以研究人员提出在单层神经网络的输入层和输出层之间增加一层或多层隐藏层,让输出层不再执行计算,只负责输出,而让隐藏层专门执行计算,从而形成了两层或多层神经网络。这些神经网络能够很好地解决非线性分类问题,但也带来了新的问题。单层神经网络由于只有一层输出层执行计算,在训练时只有一组权值需要更新,而多层神经网络有一层或多层隐藏层,多层神经元相连,在训练时多组权值该如何更新?1986年,以鲁梅尔哈特和詹姆斯·麦克莱兰(JamesMcClelland)为首的科学家提出了解决方案,即多层前馈神经网络可以采用误差反向传播算法进行训练。误差反向传播算法系统地解决了多层神经网络隐藏层权值更新的问题,并在数学上给出了完整推导。因此,人们将采用误差反向传播算法进行误差校正的多层前馈神经网络称为BP神经网络。4.4.1BP神经网络简介

BP神经网络是在输入层与输出层之间增加一层或多层神经元作为隐藏层,每一层隐藏层有若干个神经元。隐藏层与外界没有直接联系,但其状态改变能影响输入与输出之间的关系。BP神经网络可以看作多层感知机,其网络结构和多层感知机的相似。4.4.1BP神经网络简介BP神经网络结构大体可以分为以下3层。1.输入层

输入层的功能是接收外部的输入信息,并将输入信息传递给隐藏层的各个神经元。2.隐藏层

隐藏层对输入信息进行非线性变换处理,激活函数一般为Sigmoid函数、tanh函数等非线性函数。处理完毕后将结果传递给输出层,完成一次正向传播。3.输出层

输出层不再像在单层神经网络中那样具备计算功能,只负责向外界输出处理结果。4.4.2BP算法简介BP神经网络(误差反向传播神经网络)是一种典型的有监督学习算法。

其训练过程可分为两个阶段:1.前向传播阶段:输入数据从输入层开始,经过隐藏层的非线性变换,最终在输出层产生预测结果。每个神经元都会对输入信号进行加权求和,并通过激活函数进行非线性转换。2.反向传播阶段:当预测结果与真实值存在差异时,算法会计算输出误差,并将该误差从输出层反向传播至输入层。

在此过程中,误差信号会按梯度下降原则逐层传递,各层神经元的权重和偏置会根据误差贡献度进行调整,调整幅度由学习率控制。通过反复迭代这两个过程,网络参数会不断优化,最终使预测误差收敛到可接受范围,此时训练完成。4.4.2BP算法简介

BP算法的具体训练流程如下。(1)初始化BP神经网络的权值、阈值、学习率。(2)给定训练样本的特征向量和标签向量,将它们输入输入层。(3)计算隐藏层各单元的输出。(4)根据隐藏层各单元的输出,计算输出层各单元的输出。(5)比较输出结果和实际值,计算误差。(6)如果误差不满足要求,则反向传播误差,调整隐藏层到输出层的权值、阈值和输入层到隐藏层的权值、阈值。如果误差满足要求,结束训练。(7)重复步骤(3),步骤(6),直到误差满足要求,则结束训练。4.4.3BP神经网络案例编程

1.编写BP神经网络实现鸢尾花数据分类

首先需要对鸢尾花原始数据集进行处理,将原始数据集的第一行说明文字删除,将150条数据划分为两个文件,前120条数据作为训练集,另存为iris_training.csv文件;后30条数据作为测试集,另存为iris_test.csv文件。

将训练集和测试集都需要删去原来的最后一列,新增3列表示鸢尾花的分类:如果原来最后一列是0,则新增的3列为(0,0,0);如果原来最后一列是1,则新增的3列为(0,1,0);如果原来最后一列是2,则新增的3列为(0,0,1)。

构建有一个隐藏层的BP神经网络,输入为鸢尾花的4个特征,输出为3个分类,其中输出(0,0,0)为第一类,输出(0,1,0)为第二类,输出(0,0,1)为第三类。隐藏层的维度(节点数)可以人为设定,激活函数选取Sigmoid函数,学习率设为0.1,迭代次数设为30000次。4.4.3BP神经网络案例编程importpandasaspdimportnumpyasnp

#初始化神经网络参数definitialize_parameters(n_x,n_h,n_y):

np.random.seed(2)

#设置权重和偏置矩阵

w1=np.random.randn(n_h,n_x)*0.01

#用较小随机值初始化权重

b1=np.zeros(shape=(n_h,1))

#偏置初始化为0

w2=np.random.randn(n_y,n_h)*0.01

b2=np.zeros(shape=(n_y,1))

parameters={'w1':w1,'b1':b1,'w2':w2,'b2':b2}

returnparameters#正向传播计算defforward_propagation(X,parameters):

w1=parameters['w1']

b1=parameters['b1']

w2=parameters['w2']

b2=parameters['b2']

#通过正向传播来计算隐藏层输出a1和输出层输出a2,激活函数为Sigmoid

z1=np.dot(w1,X)+b1

#求输入乘权值加上偏置

a1=1/(1+np.exp(-z1))#使用激活函数求隐藏层输出

z2=np.dot(w2,a1)+b2

#求隐藏层输出乘权值加上偏置

a2=1/(1+np.exp(-z2))

#使用激活函数求输出层输出

cache={'z1':z1,'a1':a1,'z2':z2,'a2':a2}

returna2,cache4.4.3BP神经网络案例编程#计算交叉熵代价函数defcompute_cost(a2,Y,parameters):m=Y.shape[1]#Y的列数为总样本数#交叉熵计算logprobs=np.multiply(np.log(a2),Y)+np.multiply((1-Y),np.log(1-a2))cost=-np.sum(logprobs)/mreturncost#反向传播计算梯度defbackward_propagation(parameters,cache,X,Y):m=Y.shape[1]w2=parameters['w2']a1=cache['a1']a2=cache['a2']#计算输出层梯度dz2=a2-Ydw2=(1/m)*np.dot(dz2,a1.T)db2=(1/m)*np.sum(dz2,axis=1,keepdims=True)#计算隐藏层梯度dz1=np.multiply(np.dot(w2.T,dz2),1-np.power(a1,2))dw1=(1/m)*np.dot(dz1,X.T)db1=(1/m)*np.sum(dz1,axis=1,keepdims=True)grads={'dw1':dw1,'db1':db1,'dw2':dw2,'db2':db2}returngrads4.4.3BP神经网络案例编程#使用梯度下降法更新参数defupdate_parameters(parameters,grads,learning_rate=0.1):w1=parameters['w1']b1=parameters['b1']w2=parameters['w2']b2=parameters['b2']dw1=grads['dw1']db1=grads['db1']dw2=grads['dw2']db2=grads['db2']w1=w1-dw1*learning_rateb1=b1-db1*learning_ratew2=w2-dw2*learning_rateb2=b2-db2*learning_rateparameters={'w1':w1,'b1':b1,'w2':w2,'b2':b2}returnparameters#神经网络训练主函数defnn_model(X,Y,n_h,n_input,n_output,num_iterations=10000,print_cost=False):np.random.seed(3)n_x=n_inputn_y=n_outputparameters=initialize_parameters(n_x,n_h,n_y)foriinrange(0,num_iterations):#正向传播a2,cache=forward_propagation(X,parameters)#计算代价函数cost=compute_cost(a2,Y,parameters)#反向传播grads=backward_propagation(parameters,cache,X,Y)#更新参数parameters=update_parameters(parameters,grads)ifprint_costandi%1000==0:print('迭代第%i次,代价函数为:%f'%(i,cost))returnparameters4.4.3BP神经网络案例编程#使用训练好的模型进行预测defpredict(parameters,x_test,y_test):#正向传播计算预测值w1=parameters['w1']b1=parameters['b1']w2=parameters['w2']b2=parameters['b2']z1=np.dot(w1,x_test)+b1a1=np.tanh(z1)z2=np.dot(w2,a1)+b2a2=1/(1+np.exp(-z2))#预测结果的维度n_rows=y_test.shape[0]n_cols=y_test.shape[1]#存储预测结果output=np.empty(shape=(n_rows,n_cols),dtype=int)foriinrange(n_rows):forjinrange(n_cols):ifa2[i][j]>0.5:output[i][j]=1else:output[i][j]=0print('预测结果:')print(output)print('真实结果:')print(y_test)count=0forkinrange(0,n_cols):ifoutput[0][k]==y_test[0][k]andoutput[1][k]==y_test[1][k]andoutput[2][k]==y_test[2][k]:count=count+1else:print(k)4.4.3BP神经网络案例编程#计算准确率acc=count/int(y_test.shape[1])*100print('准确率:%.2f%%'%acc)if__name__=="__main__":#加载训练数据data_set=pd.read_csv('iris_training.csv',header=None)X=data_set.iloc[:,0:3].values.T#前4列是特征,T表示转置Y=data_set.iloc[:,4:6].values.T#后3列是标签Y=Y.astype('uint8')#训练模型,隐藏层包含5个节点,输入层包含4个节点,输出层包含3个节点,迭代30000次parameters=nn_model(X,Y,n_h=5,n_input=4,n_output=3,num_iterations=30000,print_cost=True)#加载训练数据data_test=pd.read_csv('iris_test.csv',header=None)x_test=data_test.ix[:,0:3].values.Ty_test=data_test.ix[:,4:6].values.Ty_test=y_test.astype('uint8')#预测并评估predict(parameters,x_test,y_test)

运行结果:4.4.3BP神经网络案例编程2.利用Neurolab提供的BP神经网络实现正弦函数拟合Neurolab提供了可以直接调用的BP神经网络,下面调用该BP神经网络实现正弦函数拟合。importneurolabasnlimportnumpyasnp

#创建训练样本x=np.linspace(-7,7,20)y=np.sin(x)*0.5size=len(x)inp=x.reshape(size,1)tar=y.reshape(size,1)#创建BP神经网络net=.newff([[-7,7]],[5,1])#训练error=net.train(inp,tar,epochs=500,show=100,goal=0.02)#测试out=net.sim(inp)#画误差曲线importpylabasplpl.subplot(211)pl.plot(error)pl.xlabel('Epochnumber')pl.ylabel('error(defaultSSE)')#画预测值和真实值x2=np.linspace(-6.0,6.0,150)y2=net.sim(x2.reshape(x2.size,1)).reshape(x2.size)y3=out.reshape(size)pl.subplot(212)pl.plot(x2,y2,'-',x,y,'.',x,y3,'p')pl.legend(['traintarget','netoutput'])pl.show()4.4.3BP神经网络案例编程

运行结果:4.5典型反馈神经网络:Hopfield神经网络4.5.1Hopfield神经网络简介

Hopfield神经网络是反馈神经网络中运用最广泛的神经网络之一,Hopfield神经网络是一种结合存储系统和二元系统的反馈神经网络,其所有神经元互相连接,形成全连接网络。Hopfield神经网络在输入的激励下,其输出会产生不断变化,反馈给输入,这个反馈过程会一直进行。若该网络是收敛的稳定网络,则反馈与迭代的计算过程所产生的输出变化越来越小,直到达到了稳定的平衡状态,此时Hopfield网络就会输出一个稳定的恒值。

Hopfield神经网络满足上述两个条件,因此具备联想记忆功能,擅长解决联想记忆、聚类和组合优化计算等方面的问题(如旅行推销员问题)。

Hopfield神经网络分为离散型Hopfield神经网络DHN)和连续型Hopfield神经网络CHNN。DHNN与CHNN的不同之处在于激活函数的不同。DHNN的激活函数一般为阶跃函数或符号函数,CHNN的激活函数一般为S型函数(如Sigmoid函数)。4.5.2DHNN简介

DHNN是早期提出的Hopfield神经网络,它是单层二值神经网络,由于其神经元的输入、输出值通常取{0,1}(也有取{–1,1}的),取值是离散的。其中,0,1(或者–1,1)分别表示神经元的两种状态(激活和抑制)。DHNN是一个单层全反馈网络,假设网络中有n个神经元,任一神经元的输出都通过连接权重接收其他神经元输出的反馈信息,神经元没有自反馈。所有神经元都受到其他神经元输出的控制,使各神经元的输出相互制约。每个神经元均设有一个阈值,当该神经元所受的刺激超过其阈值时,神经元就处于一种状态(如1),否则神经元就始终处于另一状态(如0)。4.5.2DHNN简介

DHNN结构如下,3个空心圆表示第一层神经元,其中

为3个神经元的外部输入,

为3个神经元的输出,

是神经元i对神经元j的反馈权重。神经元i的阈值为

。激活函数取阶跃函数,输入信号小于阈值为0,大于等于阈值为1。4.5.2DHNN简介

DHNN工作方式分为串行(异步)工作方式和并行(同步)工作方式。(1)串行工作方式。在这种工作方式下,每次迭代只调整某一个神经

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论