深度学习(6)构造简单的神经网络
生活随笔
收集整理的這篇文章主要介紹了
深度学习(6)构造简单的神经网络
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
一、激勵函數
?二、創建數組(初始輸入和輸出)
三、更新權重
1、創建權重(w0和w1)
2、限值(-1~1)?
3、正向傳播
4、反向傳播
4-1、求l2差錯
4-2、求l1差錯
五、更新權重
總代碼
一、激勵函數
# 激勵函數
def Sigmoid(x, deriv = False):# 反向傳播if deriv == True:return x*(x-1) #求導# 正向傳播else:return 1/(1+np.exp(-x)) #1/[1+e^(-x)]
?二、創建數組(初始輸入和輸出)
# 創建數組(輸入參數、標簽)x, y = Create_Array()
# 創建數組(輸入和標簽)
def Create_Array():# 輸入# (這里有5個數據,3個特征)x = np.array([[0, 0, 1],[0, 1, 1],[1, 0, 1],[1, 1, 1],[0, 0, 1]])print(x.shape)# 標簽(類別標簽)# 這里有5個標簽(對應5個數據),共2種標簽y = np.array([[0],[1],[1],[0],[0]])print(y.shape)return x,y
?
三、更新權重
1、創建權重(w0和w1)
# 1、創建w0和w1w0 = np.random.random((3, 4)) #3:輸入特征有3個 4:神經元數量w1 = np.random.random((4, 1)) #4:輸入特征4個 1:神經元數量(輸出特征)
?
可以看出來它的取值在0~1,我們想把它限制在-1~1。
2、限值(-1~1)?
# 2、限值在-1~1(本來是0~1)w0 = w0 * 2 - 1w1 = w1 * 2 - 1
?
3、正向傳播
矩陣:例如w0[3,4],可以理解為:前面輸入為3,后面輸出為4。
# 3、正向傳播l0 = x #輸入層(第一層)l1 = Sigmoid(np.dot(l0, w0)) #中間層(第二層)l2 = Sigmoid(np.dot(l1, w1)) #輸出層(第三層)
?
4、反向傳播
?
矩陣:例如w0[3,4],可以理解為:前面輸入為3,后面輸出為4。?
4-1、求l2差錯
l2誤差 = l2值 - 預期值?
# l2l2_loss = l2 - y # l2誤差(損失)(預測值和真實值的差)l2_delta = l2_loss * Sigmoid(l2, deriv=True) # l2每個樣本錯了多少
4-2、求l1差錯
?l1誤差 = l2誤差 * w1轉置
# l1l1_loss = l2_delta.dot(w1.T) # l1誤差(損失)(l2差錯矩陣*w1轉置)l1_delta = l2_loss * Sigmoid(l2, deriv=True) # l1每個樣本錯了多少
五、更新權重
w1 -= l1轉置 * l2差錯
w0 -= l0轉置 * l1差錯
# 5、更新權重:w1和w0w1 -= l1.T.dot(l2_delta)w0 -= l0.T.dot(l1_delta)
#每10000次打印一次(觀察優化效果)if i%10000 == 0:print('w1:', w1)print('w0', w0)print('---------------------------------------------')
觀察優化效果:?
誤差: [[ 0.32966685][-0.67656896][-0.66531841][ 0.32919543][ 0.32966685]]
w1: [[ 0.12175521][-0.31912182][-0.25200495][-0.81755089]]
w0 [[-0.92863401 0.44797085 -0.13338118 -0.47594584][ 0.18454401 0.58964472 0.20720542 -0.15294761][-0.75583748 -0.05354275 0.88698458 0.44581214]]
---------------------------------------------
誤差: [[ 9.99991933e-01][-7.32072362e-06][-9.10900613e-06][ 9.99991930e-01][ 9.99991933e-01]]
w1: [[2.69487986][2.64026488][3.62495426][3.06034898]]
w0 [[-0.74974059 0.62686427 0.04551225 -0.29705242][ 0.40014002 0.80524073 0.42280143 0.0626484 ][ 2.92079498 3.62308971 4.56361704 4.1224446 ]]
---------------------------------------------
誤差: [[ 9.99995932e-01][-3.69171529e-06][-4.46189795e-06][ 9.99996035e-01][ 9.99995932e-01]]
w1: [[2.85382632][2.80498355][3.79129229][3.22544424]]
w0 [[-0.69432892 0.68227594 0.10092392 -0.24164074][ 0.45555183 0.86065254 0.47821324 0.11806021][ 3.08851435 3.79080908 4.73133641 4.29016397]]
---------------------------------------------
誤差: [[ 9.99997276e-01][-2.47455531e-06][-2.94423290e-06][ 9.99997376e-01][ 9.99997276e-01]]
w1: [[2.94760072][2.90159829][3.88874508][3.3222891 ]]
w0 [[-0.66229777 0.71430709 0.13295506 -0.2096096 ][ 0.48758301 0.89268372 0.51024442 0.15009139][ 3.18666302 3.88895776 4.82948508 4.38831264]]
---------------------------------------------
誤差: [[ 9.99997951e-01][-1.86322517e-06][-2.19361346e-06][ 9.99998039e-01][ 9.99997951e-01]]
w1: [[3.01447732][2.97028531][3.95798219][3.39113988]]
w0 [[-0.63969395 0.73691091 0.15555889 -0.18700578][ 0.51018686 0.91528756 0.53284826 0.17269523][ 3.25635009 3.95864483 4.89917215 4.45799971]]
---------------------------------------------
誤差: [[ 9.99998358e-01][-1.49514816e-06][-1.74651365e-06][ 9.99998435e-01][ 9.99998358e-01]]
w1: [[3.06653951][3.02364596][4.01174561][3.44462675]]
w0 [[-0.62221616 0.7543887 0.17303668 -0.16952798][ 0.52766466 0.93276537 0.55032607 0.19017304][ 3.31043959 4.01273433 4.95326165 4.51208921]]
可以發現誤差在不斷減小,說明我們的神經網絡優化起了效果。
總代碼
# 簡單的神經網絡
import numpy as np# 激勵函數
def Sigmoid(x, deriv = False):# 反向傳播if deriv == True:return x*(x-1) #求導# 正向傳播else:return 1/(1+np.exp(-x)) #1/[1+e^(-x)]# 創建數組(輸入和標簽)
def Create_Array():# 輸入# (這里有5個數據,3個特征)x = np.array([[0, 0, 1],[0, 1, 1],[1, 0, 1],[1, 1, 1],[0, 0, 1]])print(x.shape)# 標簽(類別標簽)# 這里有5個標簽(對應5個數據),共2種標簽y = np.array([[0],[1],[1],[0],[0]])print(y.shape)return x,y# 更新權重
def Update_Weight(x, y):# 1、創建w0和w1w0 = np.random.random((3, 4)) #3:輸入特征有3個 4:神經元數量w1 = np.random.random((4, 1)) #4:輸入特征4個 1:神經元數量(輸出特征)# 2、限值在-1~1(本來是0~1)w0 = w0 * 2 - 1w1 = w1 * 2 - 1# 遍歷for i in range(60000):# 3、正向傳播l0 = x #輸入層(第一層)l1 = Sigmoid(np.dot(l0, w0)) #中間層(第二層)l2 = Sigmoid(np.dot(l1, w1)) #輸出層(第三層)# 4、反向傳播# l2l2_loss = l2 - y # l2誤差(損失)(預測值和真實值的差)l2_delta = l2_loss * Sigmoid(l2, deriv=True) # l2每個樣本錯了多少# l1l1_loss = l2_delta.dot(w1.T) # l1誤差(損失)(l2差錯矩陣*w1轉置)l1_delta = l2_loss * Sigmoid(l2, deriv=True) # l1每個樣本錯了多少# 5、更新權重:w1和w0w1 -= l1.T.dot(l2_delta)w0 -= l0.T.dot(l1_delta)#每10000次打印一次(觀察優化效果)if i%10000 == 0:print('誤差:', l2_loss)print('w1:', w1)print('w0', w0)print('---------------------------------------------')if __name__ == '__main__':# 創建數組(輸入參數、標簽)x, y = Create_Array()# 更新權重Update_Weight(x, y)
????????以后深度學習,一般不會自己寫,一般都是用別人寫好的框架,比如caffe、tensorflow等等框架。
總結
以上是生活随笔為你收集整理的深度学习(6)构造简单的神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树莓派视觉小车 -- 物体跟踪(Open
- 下一篇: OpenCV(基础补充)颜色空间HSV