实施Levenberg-Marquardt反向传播Python

时间:2018-07-28 20:49:58

标签: python numpy neural-network backpropagation levenberg-marquardt

我试图在python中实现Levenberg Marquardt反向传播,我读了很多次如何制作,但是我的代码出了点问题。如果有人可以帮助我或给我小费,我将非常感谢!!!我还没有优化代码,我只是想要神经网络融合。 输出结果为

  [0.99999998]
  [0.99999999]
  [0.99999999]
  [0.99999999]]

,必须为[0 1 1 0]。

RMSE可能错误:

 array([0.28300151, 0.32184131, 0.34789906, ..., 0.35355339, 0.35355339,
   0.35355339]) 

这是我的代码:

import numpy as np
import random
def sigmoid(x):return 1/(1+np.exp(-x))                    
def sigmoid_der(x):return x*(1-x)                                                                   
max_epocas= 600000
epoca=0                                                    
num_samples=4                                             


u=0.001

x=np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])                     
target=np.array([[0], [1], [1], [0]])                      

w_1=np.random.random(size=(3,3))                          
w_2=np.random.random(size=(3,1))                           
jw_1=np.zeros((4,9))
jw_2=np.zeros((4,3))
EQM=np.zeros(max_epocas)

for epoca in range(max_epocas):

 I_1=np.dot(x,w_1)
 y_1=sigmoid(I_1)                                         
 I_2=np.dot(y_1,w_2)
 y_2=sigmoid(I_2)                                       
 E=target-y_2                                            
 delta_2=np.dot((E*sigmoid_der(y_2)).T,y_1).T                      
 for i in range(0,4,1): 
  jw_2[i][0]=delta_2[0]
  jw_2[i][1]=delta_2[1]
  jw_2[i][2]=delta_2[2]
 delta_jac_2=np.linalg.inv(np.dot(jw_2.T,jw_2)+u*np.identity(3))
 delta_w_2=np.dot(np.dot(delta_jac_2,jw_2.T),E)
 w_2=w_2 + delta_w_2                                        
 delta_1=np.dot(np.dot(np.dot(delta_2,w_2.T),(sigmoid_der(y_1).T)),x ).T    
 for i in range(0,4,1):
  jw_1[i][0]=delta_1[0][0]
  jw_1[i][1]=delta_1[0][1]
  jw_1[i][2]=delta_1[0][2]
  jw_1[i][3]=delta_1[1][0]
  jw_1[i][4]=delta_1[1][1]
  jw_1[i][5]=delta_1[1][2]
  jw_1[i][6]=delta_1[2][0]
  jw_1[i][7]=delta_1[2][1]
  jw_1[i][8]=delta_1[2][2]
delta_jac_1=np.linalg.inv(np.dot(jw_1.T,jw_1)+u*np.identity(9))
delta_w_1_temp=np.dot(np.dot(delta_jac_1,jw_1.T),E)
delta_w_1=delta_w_1_temp.reshape(3,3)
w_1=w_1 + delta_w_1                                  
y=sigmoid(np.dot(w_2.T,(sigmoid(np.dot(x,w_1).T))))
EQM[epoca]=((np.dot((E.T),E))**(1/2))/num_samples      
if EQM[epoca]<0.01:
   print("A rede convergiu!")
   break


print(y.T)    

0 个答案:

没有答案