第九篇:《機器學習之神經網絡(實戰篇)》

應用讀者請求,小編提前帶大家進行實戰

我們將在下一篇迴歸基礎的知識點介紹

本篇內容:神經網絡的實戰運用

第二次世界大戰如火如荼,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)

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