深度學習入門筆記(二)————線性神經網路解決異或問題(程式碼)
阿新 • • 發佈:2018-12-09
首先梳理一下思路 輸入為1,0。00異或為0,01異或為1,10異或為1,11異或為0.所以輸出為2類如下圖可知,需要兩條線劃分。
Madaline用間接地辦法解決。多個線性函式進行劃分,然後對各個神經元的輸出做邏輯運算。如圖,用兩條直線實現了異或的劃分。
線性神經網路的辦法:對神經元加入非線性輸入,引入非線性成分,使等效的輸入維度變大
如圖,輸入x1,x2分別為1,0。再加上引入的一共5個輸入,y為線性啟用函式,用來訓練模型資料,輸出仍用sign,仍為(0,1)兩類。
1.匯入包
import numpy as np import matplotlib.pyplot as plt
2.輸入資料
5個輸入在加上偏置值設為1,則一共輸入為6個數
X = np.array([[1,0,0,0,0,0],[1,0,1,0,0,1],[1,1,0,1,0,0],[1,1,1,1,1,1]])
3.標籤 0 0 為 -1 10 為1 01 為1 11 為-1
Y = np.array([-1,1,1,-1])
4.權值初始化 6個權值 初始化為6 取值範圍 -1,1
W = (np.random.random(6)-0.5)*2
print(W)
5.設定學習率等資料
#學習率
lr = 0.11
#計算迭代次數1
n = 0
#神經網路輸出
O = 0
6.更新權值函式
# 更新權值函式 def update(): global X,Y,W,lr,n n+=1 #輸出 啟用函式改變 #O = np.sign(np.dot(X,W.T)) O = np.dot(X,W.T) #計算權值的改變 求平均 X的行 W_C = lr*((Y-O.T).dot(X))/int(X.shape[0]) W = W + W_C for _ in range(1000): #更新權值函式 update() #無論是否收斂 都迴圈1000次
收斂的條件有3個:
- 和期望值比誤差小
- 權值的改變數小
- 進行多次迴圈
這裡是進行1000次迴圈來使函式收斂
7.設定正負樣本
#正樣本
x1 = [0,1]
y1 = [1,0]
#負樣本
x2 = [0,1]
y2 = [0,1]
8.畫圖
算出y的公式
#劃線 def calculate(x,root): a = W[3] b = W[2] + x*W[4] c = W[0] + x*W[1] + x*x*W[3] if root==1: return (-b+np.sqrt(b*b-4*a*c))/(2*a) if root == 2: return (-b-np.sqrt(b*b-4*a*c))/(2*a) #取-1到2的點 xdata = np.linspace(-1,2) #畫圖 plt.figure() #有兩個值 畫兩條線 plt.plot(xdata,calculate(xdata,1),'r') plt.plot(xdata,calculate(xdata,2),'r') #正樣本 藍色表示 plt.plot(x1,y1,'bo') #負樣本 黃色表示 plt.plot(x2,y2,'yo') plt.show()
9.檢視輸出資料
# X 輸入資料 W.T迭代1000次
O = np.dot(X,W.T)
print(O)
迭代1000次的結果
可以看到輸出資料已經接近期望值
當迭代次數為10萬次時
效果圖變化不大
但輸出資料已經和期望資料一致了