簡單的神經網絡

簡單的神經網絡

從零編寫一個簡單的神經網絡模型,網絡模型採用三層架構,分別L0,L1,L2層。假設第一層3個特徵(x1,x2,x3),第二層5個神經元,第三層一個輸出。

代碼實現如下:

import numpy as np

#定義一個sigmoid函數
def sigmoid(x,deriv=False): #False表示正向傳播,True表示反向傳播
	if deriv==True:
		return x*(1-x) #反向傳播,sigmoid函數對x求導(注意x表示什麼)
	return 1/(1+np.exp(-x)) #正向傳播

#構建數據
#x表示5個訓練集樣本,3個特徵
x=np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1],[0,0,1]])  # x.shape=5*3
y=np.array([[0],[1],[1],[0],[0]])  # y.shape=5*1

#隨機初始化權重參數,爲了得到相同的結果,設置一個種子
np.random.seed(1)
#想要隨機的取值在[-11]之間,np.random.random((5,3))的取值在[0,1]之間
#w0權重參數,五行三列,第一層三個特徵(輸入),第二層五個神經元
w0=2*np.random.random((5,3))-1 #w0.shape(5*3)
#w1權重參數,一行五列,第三層一個神經元(輸出),第二層五個神經元
w1=2*np.random.random((1,5))-1 #w1.shape(1*5)

#L0-輸入層 L1-隱藏層 L2-輸出層

for i in range(200000): #迭代次數200000
	L0=x #5*3
	#L1層激活單元矩陣
	L1=sigmoid(np.dot(w0,L0.T)) #5*5 
	#L2層激活單元矩陣
	L2=sigmoid(np.dot(w1,L1)) #1*5

	#得到的L2預測值與真實值y之間的誤差
	L2_error=L2-y.T #1*5
	
	if i%10000==0: #顯示每10000的迭代結果
		print("ERROR:"+str(np.mean(np.abs(L2_error))))
	
	#反向求導
	L2_delta=L2_error * sigmoid(L2,deriv=True) #1*5 不是矩陣相乘,是對應相乘
	L1_error=w1.T .dot(L2_delta) #5*5
	L1_delta=L1_error * sigmoid(L1,deriv=True) #5*5
	w1=w1-L2_delta.dot(L1) #1*5
	w0=w0-L1_delta.dot(L0) #5*3
	

實驗結果如下:

ERROR:0.47623293376696657
ERROR:0.006051666884928206
ERROR:0.004165157389013795
ERROR:0.0033625266317263364
ERROR:0.0028926903427863955
ERROR:0.002575570488905583
ERROR:0.0023432574852742466
ERROR:0.0021637266232400823
ERROR:0.0020196546091931352
ERROR:0.0019007494572889055
ERROR:0.0018004632864876003
ERROR:0.0017144065263201853
ERROR:0.0016395123057161953
ERROR:0.00157356485203203
ERROR:0.0015149182685343045
ERROR:0.0014623210855210966
ERROR:0.001414802584411034
ERROR:0.0013715967418066462
ERROR:0.0013320899177631444
ERROR:0.0012957840000224993
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章