我想注冊(cè)網(wǎng)站我怎么做廊坊seo排名霸屏
BP算法就是反向傳播,要輸入的數(shù)據(jù)經(jīng)過(guò)一個(gè)前向傳播會(huì)得到一個(gè)輸出,但是由于權(quán)重的原因,所以其輸出會(huì)和你想要的輸出有差距,這個(gè)時(shí)候就需要進(jìn)行反向傳播,利用梯度下降,對(duì)所有的權(quán)重進(jìn)行更新,這樣的話在進(jìn)行前向傳播就會(huì)發(fā)現(xiàn)其輸出和你想要的輸出越來(lái)越接近了。
#
import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plt# 生成權(quán)重以及偏執(zhí)項(xiàng)layers_dim代表每層的神經(jīng)元個(gè)數(shù),
#比如[2,3,1]代表一個(gè)三成的網(wǎng)絡(luò),輸入為2層,中間為3層輸出為1層
def init_parameters(layers_dim):L = len(layers_dim)parameters ={}for i in range(1,L):parameters["w"+str(i)] = np.random.random([layers_dim[i],layers_dim[i-1]])parameters["b"+str(i)] = np.zeros((layers_dim[i],1))return parametersdef sigmoid(z):return 1.0/(1.0+np.exp(-z))# sigmoid的導(dǎo)函數(shù)
def sigmoid_prime(z):return sigmoid(z) * (1-sigmoid(z))# 前向傳播,需要用到一個(gè)輸入x以及所有的權(quán)重以及偏執(zhí)項(xiàng),都在parameters這個(gè)字典里面存儲(chǔ)
# 最后返回會(huì)返回一個(gè)caches里面包含的 是各層的a和z,a[layers]就是最終的輸出
def forward(x,parameters):a = []z = []caches = {}a.append(x)z.append(x)layers = len(parameters)//2# 前面都要用sigmoidfor i in range(1,layers):z_temp =parameters["w"+str(i)].dot(x) + parameters["b"+str(i)]z.append(z_temp)a.append(sigmoid(z_temp))# 最后一層不用sigmoidz_temp = parameters["w"+str(layers)].dot(a[layers-1]) + parameters["b"+str(layers)]z.append(z_temp)a.append(z_temp)caches["z"] = zcaches["a"] = a return caches,a[layers]# 反向傳播,parameters里面存儲(chǔ)的是所有的各層的權(quán)重以及偏執(zhí),caches里面存儲(chǔ)各層的a和z
# al是經(jīng)過(guò)反向傳播后最后一層的輸出,y代表真實(shí)值
# 返回的grades代表著誤差對(duì)所有的w以及b的導(dǎo)數(shù)
def backward(parameters,caches,al,y):layers = len(parameters)//2grades = {}m = y.shape[1]# 假設(shè)最后一層不經(jīng)歷激活函數(shù)# 就是按照上面的圖片中的公式寫(xiě)的grades["dz"+str(layers)] = al - ygrades["dw"+str(layers)] = grades["dz"+str(layers)].dot(caches["a"][layers-1].T) /mgrades["db"+str(layers)] = np.sum(grades["dz"+str(layers)],axis = 1,keepdims = True) /m# 前面全部都是sigmoid激活for i in reversed(range(1,layers)):grades["dz"+str(i)] = parameters["w"+str(i+1)].T.dot(grades["dz"+str(i+1)]) * sigmoid_prime(caches["z"][i])grades["dw"+str(i)] = grades["dz"+str(i)].dot(caches["a"][i-1].T)/mgrades["db"+str(i)] = np.sum(grades["dz"+str(i)],axis = 1,keepdims = True) /mreturn grades # 就是把其所有的權(quán)重以及偏執(zhí)都更新一下
def update_grades(parameters,grades,learning_rate):layers = len(parameters)//2for i in range(1,layers+1):parameters["w"+str(i)] -= learning_rate * grades["dw"+str(i)]parameters["b"+str(i)] -= learning_rate * grades["db"+str(i)]return parameters
# 計(jì)算誤差值
def compute_loss(al,y):return np.mean(np.square(al-y))# 加載數(shù)據(jù)
def load_data():"""加載數(shù)據(jù)集"""x = np.arange(0.0,1.0,0.01)y =20* np.sin(2*np.pi*x)# 數(shù)據(jù)可視化plt.scatter(x,y)return x,y
#進(jìn)行測(cè)試
x,y = load_data()
x = x.reshape(1,100)
y = y.reshape(1,100)
plt.scatter(x,y)
parameters = init_parameters([1,25,1])
al = 0
for i in range(4000):caches,al = forward(x, parameters)grades = backward(parameters, caches, al, y)parameters = update_grades(parameters, grades, learning_rate= 0.3)if i %100 ==0:print(compute_loss(al, y))
plt.scatter(x,al)
plt.show()
運(yùn)行結(jié)果: