應用讀者請求,小編提前帶大家進行實戰
我們將在下一篇迴歸基礎的知識點介紹
本篇內容:神經網絡的實戰運用
第二次世界大戰如火如荼,ZR兩國正進行情報戰
特工A交給特工B一張表,沒有告訴他數據的規律
於是特工B決定搭建一個神經網絡模型來預測.......
好吧,小編編不下去了.........
輸入的每一個樣本有三個特徵值
比如第三行 1 0 1
它對應的結果值爲 0
這是一個沒有中間層的神經網絡
(其實就是邏輯迴歸)
神經網絡輸入三個輸入值
結合權重運算的值代入激活函數
Sigmoid後得到一個預測值
對真實值進行梯度下降來擬合
通過多組樣本完成訓練
(邏輯迴歸的概念見第四篇)
這樣做其實有很大的弊端
因爲邏輯迴歸能夠“學習”的規律不能太複雜
比如這樣
甚至是這樣
邏輯迴歸在分類問題上有很大優勢
之所以我們之前的分類器識別貓可以奏效
是因爲它本質上還是分類問題
我們輸入了貓的像素值圖片後
邏輯迴歸像上圖一樣“劃線分類”
根據色差“畫出”貓的形狀並判斷
邏輯迴歸進行物體識別準確率其實非常低
目前業內最流行的方法是
卷積神經網絡RNN圖像識別
(後面會慢慢介紹)
爲了讓模型可以“學習”更加複雜的內容
科學家們推出了神經網絡
可以通過證明得到:
三層以上的神經網絡可以擬合幾乎任何函數
由於很多基礎知識沒有介紹完
這裏不做詳細講述(限於篇幅)
這是個簡單的完整的神經網絡算法的代碼
感興趣的同學可以測試一下代碼
import numpy as np # 導入Numpy庫(矩陣運算) def sigmoid(x): # Sigmoid函數(激活函數) return 1/(1+np.exp(-x)) def sigmoid_(x): # Sigmoid導數(Sigmoid的偏微分)(反向傳播) return x*(1-x) X = np.array([[0,0,1], # 樣本特徵值(神經網絡的輸入值) [0,1,1], [1,0,1], [1,1,1]]) y = np.array([[1], # 樣本結果值(神經網絡要擬合的值) [0], [1], [0]]) # 隨機初始化對於神經網絡來說至關重要! theta0 = 2*np.random.random((3,4)) - 1 # (隨機初始化)第一層到第二層的 權重 theta1 = 2*np.random.random((4,1)) - 1 # (隨機初始化)第二層到第三層的 權重 for i in range(50000): # 反覆模型訓練,調整參數 a0=X # 第一層輸入樣本的特徵 a1=sigmoid(np.dot(a0,theta0)) # 前向傳播得到第二層 a2=sigmoid(np.dot(a1,theta1)) # 前向傳播得到第三層 a2_error=y-a2 # 計算輸出層誤差 a2_delta=a2_error*sigmoid_(a2) # 反向傳播計算 a1_error=a2_delta.dot(theta1.T) # 反向傳播計算 a1_delta=a1_error*sigmoid_(a1) # 反向傳播計算 theta1+=a1.T.dot(a2_delta) # 更新 權重 theta0+=a0.T.dot(a1_delta) # 更新 權重 if (i% 10000 == 0): print ("\n第"+str(i)+"次訓練的誤差:") print (abs(a2_error)) print ("權重") print (theta0) print (theta1)