Python实现BP神经网络

来源:千锋教育
发布时间:2023-11-07 15:47:20
分享

首先实现几个工具函数:

defrand(a,b):

return(b-a)*random.random()+a

defmake_matrix(m,n,fill=0.0):#创造一个指定大小的矩阵

mat=[]

foriinrange(m):

mat.append([fill]*n)

returnmat

定义sigmod函数和它的导数:

defsigmoid(x):

return1.0/(1.0+math.exp(-x))

defsigmod_derivate(x):

returnx*(1-x)

定义BPNeuralNetwork类,使用三个列表维护输入层,隐含层和输出层神经元,列表中的元素代表对应神经元当前的输出值.使用两个二维列表以邻接矩阵的形式维护输入层与隐含层,隐含层与输出层之间的连接权值,通过同样的形式保存矫正矩阵.

定义setup方法初始化神经网络:

defsetup(self,ni,nh,no):

self.input_n=ni+1

self.hidden_n=nh

self.output_n=no

#initcells

self.input_cells=[1.0]*self.input_n

self.hidden_cells=[1.0]*self.hidden_n

self.output_cells=[1.0]*self.output_n

#initweights

self.input_weights=make_matrix(self.input_n,self.hidden_n)

self.output_weights=make_matrix(self.hidden_n,self.output_n)

#randomactivate

foriinrange(self.input_n):

forhinrange(self.hidden_n):

self.input_weights[i][h]=rand(-0.2,0.2)

forhinrange(self.hidden_n):

foroinrange(self.output_n):

self.output_weights[h][o]=rand(-2.0,2.0)

#initcorrectionmatrix

self.input_correction=make_matrix(self.input_n,self.hidden_n)

self.output_correction=make_matrix(self.hidden_n,self.output_n)

定义predict方法进行一次前馈,并返回输出:

defpredict(self,inputs):

#activateinputlayer

foriinrange(self.input_n-1):

self.input_cells[i]=inputs[i]

#activatehiddenlayer

forjinrange(self.hidden_n):

total=0.0

foriinrange(self.input_n):

total+=self.input_cells[i]*self.input_weights[i][j]

self.hidden_cells[j]=sigmoid(total)

#activateoutputlayer

forkinrange(self.output_n):

total=0.0

forjinrange(self.hidden_n):

total+=self.hidden_cells[j]*self.output_weights[j][k]

self.output_cells[k]=sigmoid(total)

returnself.output_cells[:]

定义back_propagate方法定义一次反向传播和更新权值的过程,并返回最终预测误差:

defback_propagate(self,case,label,learn,correct):

#feedforward

self.predict(case)

#getoutputlayererror

output_deltas=[0.0]*self.output_n

foroinrange(self.output_n):

error=label[o]-self.output_cells[o]

output_deltas[o]=sigmod_derivate(self.output_cells[o])*error

#gethiddenlayererror

hidden_deltas=[0.0]*self.hidden_n

forhinrange(self.hidden_n):

error=0.0

foroinrange(self.output_n):

error+=output_deltas[o]*self.output_weights[h][o]

hidden_deltas[h]=sigmod_derivate(self.hidden_cells[h])*error

#updateoutputweights

forhinrange(self.hidden_n):

foroinrange(self.output_n):

change=output_deltas[o]*self.hidden_cells[h]

self.output_weights[h][o]+=learn*change+correct*self.output_correction[h][o]

self.output_correction[h][o]=change

#updateinputweights

foriinrange(self.input_n):

forhinrange(self.hidden_n):

change=hidden_deltas[h]*self.input_cells[i]

self.input_weights[i][h]+=learn*change+correct*self.input_correction[i][h]

self.input_correction[i][h]=change

#getglobalerror

error=0.0

foroinrange(len(label)):

error+=0.5*(label[o]-self.output_cells[o])**2

returnerror

定义train方法控制迭代,该方法可以修改最大迭代次数,学习率λ,矫正率μ三个参数.

deftrain(self,cases,labels,limit=10000,learn=0.05,correct=0.1):

foriinrange(limit):

error=0.0

foriinrange(len(cases)):

label=labels[i]

case=cases[i]

error+=self.back_propagate(case,label,learn,correct)

编写test方法,演示如何使用神经网络学习异或逻辑:

deftest(self):

cases=[

[0,0],

[0,1],

[1,0],

[1,1],

]

labels=[[0],[1],[1],[0]]

self.setup(2,5,1)

self.train(cases,labels,10000,0.05,0.1)

forcaseincases:

print(self.predict(case))

以上内容为大家介绍了Python实现BP神经网络,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。

声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • python 抽象类 什么是抽象类与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化为什么要有抽象类如果说类是从一堆对象中抽取相同的内容而来
  • python 抽象类和抽象接口 抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。抽象类是一个介于类和接口直接的一个概念,同时具备类和接口
  • python 的面试题 问题1到底什么是Python?你可以在回答中与其他技术进行对比(也鼓励这样做)。答案下面是一些关键点:Python是一种解释型语言。这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需
  • Python类的实例化 基本形式:实例对象名=类名(参数)在实例化的过程中,self代表的就是这个实例对象自己。实例化时会把类名后面接的参数传进去赋值给实例,这样传进去的参数就成为了这个实例对象的属性。实例化的过程遵循函数调
  • Python 类和实例的属性 类属性.类属性是可以直接通过“类名.属性名”来访问和修改。.类属性是这个类的所有实例对象所共有的属性,任意一个实例对象都可以访问并修改这个属性(私有隐藏除外)。.对类属性的修改,遵循基本数据类型的特性
  • Python 类的私有属性和方法 在Python中,通过单下划线”_”来实现模块级别的私有化,一般约定以单下划线”_”开头的变量、函数为模块私有的,也就是说”frommoduleNameimport*”将不会引入以单下划线”_”开头的