1. 程式人生 > >深度學習入門筆記(二)————線性神經網路解決異或問題(程式碼)

深度學習入門筆記(二)————線性神經網路解決異或問題(程式碼)

首先梳理一下思路 輸入為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個:

  1. 和期望值比誤差小
  2. 權值的改變數小
  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萬次時

效果圖變化不大

但輸出資料已經和期望資料一致了