我试图在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)