首先實現(xiàn)幾個工具函數(shù):
defrand(a,b):
return(b-a)*random.random()+a
defmake_matrix(m,n,fill=0.0):#創(chuàng)造一個指定大小的矩陣
mat=[]
foriinrange(m):
mat.append([fill]*n)
returnmat
定義sigmod函數(shù)和它的導數(shù):
defsigmoid(x):
return1.0/(1.0+math.exp(-x))
defsigmod_derivate(x):
returnx*(1-x)
定義BPNeuralNetwork類,使用三個列表維護輸入層,隱含層和輸出層神經(jīng)元,列表中的元素代表對應神經(jīng)元當前的輸出值.使用兩個二維列表以鄰接矩陣的形式維護輸入層與隱含層,隱含層與輸出層之間的連接權值,通過同樣的形式保存矯正矩陣.
定義setup方法初始化神經(jīng)網(wǎng)絡:
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方法控制迭代,該方法可以修改最大迭代次數(shù),學習率λ,矯正率μ三個參數(shù).
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方法,演示如何使用神經(jīng)網(wǎng)絡學習異或邏輯:
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))
以上內(nèi)容為大家介紹了Python實現(xiàn)BP神經(jīng)網(wǎng)絡,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。