同学你好,这就是一个做了矩阵乘法又做激活的,然后重复一遍,最后得到的数值跟y=1做平方损失,得到的损失函数做两次梯度下降就行啊
仅供参考
import numpy as np
def net(X, W): #求神经网络传递输入输出
Y1 = X.dot([[W[0],W[1],W[2]],[W[3],W[4],W[5]]])
S = 1/(1+np.exp(-Y1))
Y2 = S.dot([W[6],W[7],W[8]])
return 1/(1+np.exp(-Y2))
def loss(Y,Ylabel):
return 0.5*np.sum((Y-Ylabel)*(Y-Ylabel))#求损失函数(平方损失)
def gradient(W, X, Ylabel, h): #求梯度
G = np.zeros(len(W));
W0 = np.zeros(len(W));
for i in range(len(W)):
for j in range(len(W)):
W0[j] = W[j]
W0[i] = W0[i] + h
Y0 = net(X,W0)
Y = net(X,W)
G[i] = (loss(Y0,Ylabel) - loss(Y, Ylabel))/h #求得梯度
return G
X0 = np.array([1,-0.5])
W0 = np.array([1.2,2.1,1.5,-0.3,-0.7,0.3,-0.2,0.5,1.3])
Ylabel = 1
Y = net(X0, W0)
h = 1e-5#求梯度的步长值
learningRate = 1 #学习率
print('初始Theta2:') #打印初始Theta2
print(np.array([W[6],W[7],W[8]]))
for i in range(2): #循环两次
G = gradient(W0, X0, Ylabel, h) #第一次梯度值
W = W0 - learningRate*G
Theta2_i = np.array([W[6],W[7],W[8]])
print('第{}次Theta_2 : '.format(i+1)) #打印第i次Theta2
print(Theta2_i)
W0 = W
Theta1_2 = np.array([[W[0],W[1],W[2]],[W[3],W[4],W[5]]])# 第二次的theta1
Theta2_2 = np.array([W[6],W[7],W[8]])# 第二次的theta2
print('\n第二次Theta2 :')
print(Theta2_2)
输出情况:
初始Theta2:
[-0.14804429 0.56023926 1.35200909]
第1次Theta_2 :
[-0.17266922 0.53168204 1.32733078]
第2次Theta_2 :
[-0.14804429 0.56023926 1.35200909]
第二次Theta2 :
[-0.14804429 0.56023926 1.35200909]
这个最后两行输出就是第二次的Theta2的数值