機器學習之簡單三層神經網路實現
阿新 • • 發佈:2019-01-28
import numpy as np
#本專案實現簡單神經網路模型
#非線性函式
#前向傳播:直接返回sigmoid啟用函式
#反向傳播:對sigmoid函式求倒數,即x*(1-x)
def nonlin(x,deriv=False):
if (deriv == True):
return x*(1-x)
return 1/(1+np.exp(-x))
#輸入樣本
x = np.array([[0,0,1],
[0,1,1],
[1,0,1],
[1,1,1]])
#0代表一類,1代表一類
y = np.array([[0 ],
[1],
[1],
[0]])
np.random.seed(1)
#初始化權重引數,構造一個3行4列的權重引數矩陣
w0 = 2*np.random.random((3,4))-1
w1 = 2*np.random.random((4,1))-1
for j in xrange(60000):
#輸入層
l0 = x
#中間層
l1 = nonlin(np.dot(l0,w0))
#輸出層
l2 = nonlin(np.dot(l1,w1))
#計算輸出與我們預定的結果的差距,如果l2_error很大,說明誤差很大,
#需要對W進行較大的調整
l2_error = y-l2
#每10000次列印一下
if (j % 10000) == 0:
print "Error:" + str(np.mean(np.abs(l2_error)))
#求l2的梯度
l2_delta = l2_error * nonlin(l2,deriv=True)
#算出l1對追蹤結果誤差的影響,w1.T是w1的梯度
l1_error = l2_delta.dot(w1.T)
#求l1的梯度
l1_delta = l1_error * nonlin(l1,deriv=True )
#對W0,W1進行修正
w1 += l1.T.dot(l2_delta)
w0 += l0.T.dot(l1_delta)
Error:0.496410031903
Error:0.00858452565325
Error:0.00578945986251
Error:0.00462917677677
Error:0.00395876528027
Error:0.00351012256786