1 結構
如下圖所示,其實質就是一種映射關係。
2 學習規則
實質是更新權值,具體過程見如下公式。
-
其中,i=0,1,2,…; y是網絡輸出;f是sign函數 -
其中, 是學習率;t是正確標籤,取值也是{1,-1} -
3 學習率
如上節所示,學習率對權值更新速度影響極大。取值在0~1。
學習率太大,容易造成權值調整不穩定;
學習率太小,權值調整太慢,迭代次數太多。
4 收斂條件
一般有以下幾種情形:
- 誤差小於某個預先設定的較小的值
- 兩次迭代之間的權值變化已經很小
- 設定最大迭代次數,當迭代超過最大次數就停止
5 案例
假設我們有4個2維的數據,數據的特徵分別(3,3),(4,3),(1,1),(2,1)。(3,3),(4,3)這兩個數據的標籤爲1,(1,1),(2,1)這兩個數據的標籤爲-1,構建神經網絡來進行分類。
import numpy as np
import matplotlib.pyplot as plt
# 定義輸入數據:2維數據爲2個輸入節點,加一個偏置值,此處設爲1
X = np.array([[1,3,3],
[1,4,3],
[1,1,1],
[1,2,1]])
# 定義標籤
T = np.array([[1],
[1],
[-1],
[-1]])
# 權值初始化(3行:輸入個數,1列:輸出個數),0~1的隨機數
W = np.random.random([3,1])
# 學習率設置
lr = 0.1
# 神經網絡輸出
Y = 0
# 更新權值函數
def train():
global X,Y,W,lr,T
# 同時計算4個數據的預測值,Y(4,1)
Y = np.sign(np.dot(X,W))
# T-Y得到4個標籤值與預測值的誤差E(4,1)
E = T - Y
# 計算權值的變化(求均值)
delta_W = lr * (X.T.dot(E)) / X.shape[0]
# 更新權值
W = W + delta_W
# 訓練模型
for i in range(100):
# 更新權值
train()
# 打印當前訓練次數
print('epoch:',i+1)
# 當前的權值
print('weights:',W)
# 計算當前輸出
Y = np.sign(np.dot(X,W))
# all()表示Y中的所有值跟T中的所有值都對應相等,才爲真
if (Y == T).all():
print('Finished')
# 跳出循環
break
# 可視化
# 正樣本的xy座標
x1 = [3,4]
y1 = [3,3]
# 負樣本xy座標
x2 = [1,2]
y2 = [1,1]
# 定義分類邊界線的斜率和截距(邊界線是W0+W1X1+W2X2=0)
k = -W[1]/W[2]
d = -W[0]/W[2]
# 設定兩個點
xdata = (0,5)
# 通過兩點來確定一條直線,用紅色的線來畫出分界線
plt.plot(xdata,xdata*k+d,'r')
# 用藍色的點畫正樣本
plt.scatter(x1,y1,c='b')
# 用黃色的點畫負樣本
plt.scatter(x2,y2,c='y')
plt.show()