實例2-手寫簡單神經網絡

 

'''
Created on 2019年x月x日

@author: xxx
'''
import numpy as np  
  
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]]) 
print (X.shape )
                  
y = np.array([[0],  
            [1],  
            [1],  
            [0]])  
print (y.shape)
np.random.seed(1)  
  
# randomly initialize our weights with mean 0  
w0 = 2*np.random.random((3,4)) - 1   #在+1和-1之間
w1 = 2*np.random.random((4,1)) - 1
print (w0)
print (w1)
print (w0.shape)
print (w1.shape)
  
for j in range(60000):  #python3中不是xrange
  
     
    l0 = X  
    l1 = nonlin(np.dot(l0,w0))  #X->乘w0->nonlin,默認前向傳播
    l2 = nonlin(np.dot(l1,w1))  
  
      
    l2_error = y - l2  
      
    if (j% 10000) == 0:  #每一萬次打印一次
        print ("Error:" + str(np.mean(np.abs(l2_error))))  
          
    #開始反向傳播了
    l2_delta = l2_error*nonlin(l2,deriv=True)  #對應乘而非矩陣乘
  
     
    l1_error = l2_delta.dot(w1.T)  
      
      
    l1_delta = l1_error * nonlin(l1,deriv=True)  
    #更新w
    w1 += l1.T.dot(l2_delta)  #“+=”的原因是前面是“y - l2 ”
    w0 += l0.T.dot(l1_delta)  
    

結果:會發現Error越來越小,

(4, 3)
(4, 1)
[[-0.16595599  0.44064899 -0.99977125 -0.39533485]
 [-0.70648822 -0.81532281 -0.62747958 -0.30887855]
 [-0.20646505  0.07763347 -0.16161097  0.370439  ]]
[[-0.5910955 ]
 [ 0.75623487]
 [-0.94522481]
 [ 0.34093502]]
(3, 4)
(4, 1)
Error:0.496410031903
Error:0.00858452565325
Error:0.00578945986251
Error:0.00462917677677
Error:0.00395876528027
Error:0.00351012256786

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章