用python或matlab都可以,不能用框架
设初始化时Wij=1,两个隐藏层,取网络节点个数分别为(3,4),输出层结点为1。编写BP程序,并用符合y=abs(cosx),x属于-2pi-2pi之间的100组样本进行训练,看训练完成后,网络对 y 的逼近效果。若效果不理想,再增加一个5节点的隐层,然后再训练,结果如何?
纯代码实现的神经网络,在google里一找一大把。你说你没有编出来,如果你是写了有问题,可以把具体代码和问题说清楚。如果你根本不感兴趣,只是糊弄个作业,就找一个现成的改一改。如果你改都不会改,那么请开价。
import numpy as np
import math
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100).reshape(1,100)
y = np.abs(np.cos(x))
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y,c='skyblue')
plt.ion()
iter_times=2500
a=0.1
def sigmoid(x):
return 1/(1+np.exp(-x))
def diriv(a):
return a*(1-a)
W1 =np.random.random((3,1))
W2 =np.random.random((4,3))
W3 =np.random.random((1,4))
b1 =0
b2 =0
b3 =0
Cost=[]
def front(x,W1,W2,W3,b1,b2,b3):
Z1=np.dot(W1,x)+b1
A1=sigmoid(Z1)
Z2=np.dot(W2,A1)+b2
A2=sigmoid(Z2)
Z3=np.dot(W3,A2)+b3
A3=sigmoid(Z3)
return A3
for i in range(iter_times):
Z1=np.dot(W1,x)+b1
A1=sigmoid(Z1)
Z2=np.dot(W2,A1)+b2
A2=sigmoid(Z2)
Z3=np.dot(W3,A2)+b3
A3=sigmoid(Z3)
J=0.5*pow(A3-y,2)
J=1/100*J.sum(axis=1)
Cost.append(abs(J))
dZ3=A3-y
dW3=1/100 *np.dot(dZ3,A2.T)
db3=1/100*np.sum(dZ3, axis=1, keepdims=True)
dZ2=np.dot(W3.T,dZ3)*diriv(A2)
dW2=1/100*np.dot(dZ2,A1.T)
db2=1/100*np.sum(dZ2, axis=1, keepdims=True)
dZ1=np.dot(W2.T,dZ2)*diriv(A1)
dW1=1/100*np.dot(dZ1,x.T)
db1=1/100*np.sum(dZ1, axis=1, keepdims=True)
W3=W3-a*dW3
W2=W2-a*dW2
W1=W1-a*dW1
b3=b3-a*db3
b2=b2-a*db2
b1=b1-a*db1
y_pre=front(x,W1,W2,W3,b1,b2,b3)
plt.plot(x, y_pre,'-')
plt.show()