文章主要參考原文是matlab版本的實現。在此基礎上,利用python實現bp網路對函式
**如下:相應部分都有注釋
###2018.08.15
###啟用函式用的是sigmoid
import numpy as np
import math
#import matplotlib.pyplot as plt
x = np.linspace(-3,3,100)
x_size = x.size
y = np.zeros((x_size,1))
# print(y.size)
for i in range(x_size):
y[i]= math.sin(x[i])
hidesize = 10
w1 = np.random.random((hidesize,1)) #輸入層與隱層之間的權重
b1 = np.random.random((hidesize,1)) #隱含層神經元的閾值
w2 = np.random.random((1,hidesize)) #隱含層與輸出層之間的權重
b2 = np.random.random((1,1)) #輸出層神經元的閾值
threshold = 0.005
max_steps = 501
def sigmoid(x_):
y_ = 1/(1+math.exp(-x_))
return y_
e = np.zeros((max_steps,1))#誤差隨迭代次數的變化
y = np.zeros((x_size,1)) # 模型的輸出結果
for k in range(max_steps):
temp = 0
for i in range(x_size):
hide_in = np.dot(x[i],w1)-b1 # 隱含層輸入資料
#print(x[i])
hide_out = np.zeros((hidesize,1)) #隱含層的輸出資料
for j in range(hidesize):
#print("第{}個的值是{}".format(j,hide_in[j]))
#print(j,sigmoid(j))
hide_out[j] = sigmoid(hide_in[j])
#print("第{}個的值是{}".format(j, hide_out[j]))
#print(hide_out[3])
y_out = np.dot(w2,hide_out) - b2 #模型輸出
y[i] = y_out
e = y_out - y[i] # 模型輸出減去實際結果。得出誤差
##反饋,修改引數
db2 = -1*threshold*e
dw2 = e*threshold*np.transpose(hide_out)
db1 = np.zeros((hidesize,1))
for j in range(hidesize):
db1[j] = np.dot(np.dot(w2[0][j],sigmoid(hide_in[j])),(1-sigmoid(hide_in[j]))*(-1)*e*threshold)
dw1 = np.zeros((hidesize,1))
for j in range(hidesize):
dw1[j] = np.dot(np.dot(w2[0][j],sigmoid(hide_in[j])),(1-sigmoid(hide_in[j]))*x[i]*e*threshold)
w1 = w1 - dw1
b1 = b1 - db1
w2 = w2 - dw2
b2 = b2 - db2
temp = temp + abs(e)
e[k] = temp
if k%100==0:
print(k)
上面是實現對正弦函式逼近的**,具體畫圖部分沒有貼。迭代500的效果如下:
可以看到效果不是很好,主要有以下原因:第一是在函式上取得點過少(上面**中取了100個點);第二就是迭代次數還達不到。大家都知道神經網路,需要大量資料以及高額的計算代價。改變引數,選取600個點以及迭代700次,效果如下:
可以發現效果比剛才已經好了很多。繼續增加迭代次數,可以得到更好的擬合效果,另外誤差的效果圖這裡就不再展示了,感興趣的可以自己用**實現。
###2018.08.14
###啟用函式用的是sigmoid
import numpy as np
import math
import matplotlib.pyplot as plt
x = np.linspace(-3,3,600)
# print(x)
# print(x[1])
x_size = x.size
y = np.zeros((x_size,1))
# print(y.size)
for i in range(x_size):
y[i]= math.sin(x[i])
# print(y)
hidesize = 10
w1 = np.random.random((hidesize,1)) #輸入層與隱層之間的權重
b1 = np.random.random((hidesize,1)) #隱含層神經元的閾值
w2 = np.random.random((1,hidesize)) #隱含層與輸出層之間的權重
b2 = np.random.random((1,1)) #輸出層神經元的閾值
threshold = 0.005
max_steps = 1001
def sigmoid(x_):
y_ = 1/(1+math.exp(-x_))
return y_
e = np.zeros((max_steps,1))#誤差隨迭代次數的變化
y = np.zeros((x_size,1)) # 模型的輸出結果
for k in range(max_steps):
temp = 0
for i in range(x_size):
hide_in = np.dot(x[i],w1)-b1 # 隱含層輸入資料
#print(x[i])
hide_out = np.zeros((hidesize,1)) #隱含層的輸出資料
for j in range(hidesize):
#print("第{}個的值是{}".format(j,hide_in[j]))
#print(j,sigmoid(j))
hide_out[j] = sigmoid(hide_in[j])
#print("第{}個的值是{}".format(j, hide_out[j]))
#print(hide_out[3])
y_out = np.dot(w2,hide_out) - b2 #模型輸出
#print(y_out)
y[i] = y_out
#print(i,y[i])
e = y_out - y[i] # 模型輸出減去實際結果。得出誤差
##反饋,修改引數
db2 = -1*threshold*e
dw2 = e*threshold*np.transpose(hide_out)
db1 = np.zeros((hidesize,1))
for j in range(hidesize):
db1[j] = np.dot(np.dot(w2[0][j],sigmoid(hide_in[j])),(1-sigmoid(hide_in[j]))*(-1)*e*threshold)
dw1 = np.zeros((hidesize,1))
for j in range(hidesize):
dw1[j] = np.dot(np.dot(w2[0][j],sigmoid(hide_in[j])),(1-sigmoid(hide_in[j]))*x[i]*e*threshold)
w1 = w1 - dw1
b1 = b1 - db1
w2 = w2 - dw2
b2 = b2 - db2
temp = temp + abs(e)
e[k] = temp
if k%100==0:
print(k)
plt.figure()
plt.plot(x,y)
plt.plot(x,y,color='red',linestyle='--')
plt.show()
#誤差函式圖直接上面兩個函式值y和y相減即可。
BP神經網路的函式逼近
給出乙個非線性的函式,建立bp神經網路進行擬合影象,其中隱藏神經元的數目為,可以設定。bp神經網路的函式逼近k 2 x 1 05 8 f 1 sin k pi 2 x 建立bp神經網路結構 隱藏層為5 未訓練引數 n 10 net newff minmax x n,1 trainlm y1 sim ...
用BP神經網路逼近正弦函式
網路中設定輸入層與輸出層均為乙個神經元,並且考慮到正弦函式的值域分布情況,我這一次在輸出層中的啟用函式並沒有使用以前常用的sigmod函式,而是採用了線性函式y x 具體實現 如下所示 clc,clear data 3 0.01 3 xsize size data datasize xsize 2 ...
BP神經網路
基本bp神經網路演算法包括 訊號的前向傳播 誤差的反向傳播 也即計算實際輸出時按照輸入到輸出的方向進行,權值閾值調整則相反。bp是一種多層前饋神經網路,由輸入層 隱含層和輸出層組成。層與層之間有兩種訊號在流動 一種是從輸入流向輸出的工作訊號,是輸入和權值的函式 另一種是輸入流向輸出的訊號,即誤差。隱...