神经网络的python实现

来源:互联网 发布:动画ppt制作软件 编辑:程序博客网 时间:2024/05/21 00:52

在Ng的机器学习课程中,看到了神经网络算法。但是算法看过之后,就会忘记。然后照着别人的代码敲了一遍,了解了神经网络算法的真正流程,对于算法细节,我就不赘述了,直接上代码,在代码中,写明实现的细节。

构造一个三层的神经网络,输入层,隐藏层和输出层,分别记为input,hidden和output.

创建一个神经网络的类,它的构造方法初始化输入层,隐藏层和输出层的神经单元个数,初始化神经单元的值,初始化输入-隐藏层的权重,隐藏-输出层的权重,最后初始化的矫正参数。代码如下:

class BPNeuralNetwork:def __init__(self):self.input_n=0self.hidden_n=0self.output_n=0self.input_cells=[]self.hidden_cells=[]self.output_cells=[]self.input_weights=[]self.output_weights=[]self.input_correction=[]self.output_correction=[]
方法setup()将类中的变量,进行赋值,其实作用与__init__方法相同,但是它实现了真正的初始化。代码如下:
def setup(self,ni,nh,no):self.input_n=ni+1self.hidden_n=nhself.output_n=noself.input_cells=[1.0]*self.input_nself.hidden_cells=[1.0]*self.hidden_nself.output_cells=[1.0]*self.output_nself.input_weights=make_matrix(self.input_n,self.hidden_n)self.output_weights=make_matrix(self.hidden_n,self.output_n)for i in range(self.input_n):for h in range(self.hidden_n):self.input_weights[i][h]=rand(-0.2,0.2)for h in range(self.hidden_n):for o in range(self.output_n):self.output_weights[h][o]=rand(-2.0,2.0)self.input_correction=make_matrix(self.input_n,self.hidden_n)self.output_correction=make_matrix(self.hidden_n,self.output_n)
接下来,就是计算神经元的值传给下一层,选择的激活函数是tanh函数,比sigmod函数好一些,它的导数知识自行查看,函数定义为:

def sigmod(x):return math.tanh(x)def sigmod_derivate(x):return 1.0-x**2

计算神经元的值传给下一层的是乘以权重进行累加求和,非常简单。

def predict(self,inputs):for i in range(self.input_n-1):self.input_cells[i]=inputs[i]for i in range(self.hidden_n):total=0.0for j in range(self.input_n):total+=self.input_cells[j]*self.input_weights[j][i]self.hidden_cells[i]=sigmod(total)for k in range(self.output_n):total=0.0for j in range(self.hidden_n):total+=self.hidden_cells[j]*self.output_weights[j][k]self.output_cells[k]=sigmod(total)return self.output_cells[:]
接下来就是神经网络的核心部分,反向传播法更新参数,我弄了好久才弄懂,也不知道是否是真的懂。还是写一下原理吧,以免以后我自己会忘记。

神经网络上的误差为:啊啊啊,我不知道咋编辑公式,我就在白纸上写了,真是要low爆了吧。我写出来,有可能大家还是看不懂,只能方便我以后复习,但是看代码应该就懂了。

def back_propagate(self,case,label,learn,correct):self.predict(case) out_error=[0.0]*self.output_nfor i in range(self.output_n):error=label[i]-self.output_cells[i]out_error[i]=sigmod_derivate(self.output_cells[i])*errorhidden_error=[0.0]*self.hidden_nfor i in range(self.hidden_n):error=0.0for j in range(self.output_n):error+=out_error[j]*self.output_weights[i][j]hidden_error[i]=sigmod_derivate(self.hidden_cells[i])*errorfor i in range(self.hidden_n):for j in range(self.output_n):change=out_error[j]*self.hidden_cells[i]self.output_weights[i][j]+=learn*change+correct*self.output_correction[i][j]self.output_correction[i][j]=changefor i in range(self.input_n):for j in range(self.hidden_n):change=hidden_error[j]*self.input_cells[i]self.input_weights[i][j]+=learn*change+correct*self.input_correction[i][j]self.input_correction[i][j]=changeerror=0.0for i in range(len(label)):error+=0.5*(label[i]-self.output_cells[i])**2return error 
然后进行异或的测试:
def train(self,cases,labels,limit=1000,learn=0.5,correct=0.1):for num in range(limit):error=0.0for i in range(len(cases)):label=labels[i]case=cases[i]error+=self.back_propagate(case,label,learn,correct)if(num%100==0):print errordef test(self):cases=[[0,0],[0,1],[1,0],[1,1]]labels=[[0],[1],[1],[0]]   self.setup(2,2,1)self.train(cases,labels,1000,0.5,0.1)for case in cases:print(self.predict(case))if __name__=='__main__':nn=BPNeuralNetwork()nn.test()
最后嘞,我的运行截图:


算法的代码参照:http://git.oschina.net/hdt3213/ClassifiersDemo/blob/master/BPNN/bpnn.py,免得说我抄袭呀!

原创粉丝点击