聲明:本人為機器學習初學者,此博文純?yōu)閭€人學習總結(jié)之用,難免出現(xiàn)紕漏錯誤之處,歡迎各位批評指正,不惜吝教!
編程環(huán)境:Anaconda3 , Python3.7
編程練習介紹
在本練習中,您將使用與之前編程作業(yè)(邏輯回歸識別手寫數(shù)字)中相同的訓練集,從而實現(xiàn)神經(jīng)網(wǎng)絡向前傳播算法的手寫數(shù)字識別。 神經(jīng)網(wǎng)絡相比較邏輯回歸而言,能夠表示非線性假設的復雜模型。而邏輯回歸不能形成更復雜的假設,因為它只是一個線性分類器.。本次的編程練習,還將使用已經(jīng)訓練過的神經(jīng)網(wǎng)絡中的參數(shù)。 您的目標是實現(xiàn)向前傳播算法并使用我們的參數(shù)進行預測。 在下周的練習中,將編寫神經(jīng)網(wǎng)絡參數(shù)的反向傳播算法。
數(shù)據(jù)分析
本次的編程練習,提供兩個文件分別是:ex3data1.mat 和 ex3weights.mat 點擊鏈接即可獲取
-
ex3data1.mat 中包含5000個手寫數(shù)字訓練示例的數(shù)據(jù)集: 0~9 中十個數(shù)字,每個數(shù)字有500個樣式。共5000樣本數(shù)據(jù)。
每個訓練樣例 20像素*20像素 ,展開成向量為400維行向量,由于每個訓練樣例都為數(shù)據(jù)矩陣X中的一行,所以X 5000行 400列 , 而標簽矩陣y 5000行 1列。ex3data1.mat中的數(shù)據(jù)部分信息如下圖所示:
-
ex3weights.mat 中是已經(jīng)幫我們訓練好的參數(shù)theta1和theta2,ex3weights.mat中的數(shù)據(jù)部分信息如下圖所示:
模型表示
使用神經(jīng)網(wǎng)絡的第一件事,就是建立神經(jīng)網(wǎng)絡模型,即確定神經(jīng)網(wǎng)絡的層數(shù)以及每層神經(jīng)單元的數(shù)量。神經(jīng)網(wǎng)絡模型由三層構成:輸入層,隱藏層,輸出層。通常輸入層的神經(jīng)單元數(shù)即我們訓練集的特征數(shù)量,而輸出層的神經(jīng)單元數(shù)即我們訓練集結(jié)果的類的數(shù)量。我們真正要確定的是隱藏層的層數(shù)和每個中間層的單元數(shù),而一個合理的默認選項:只使用單個隱藏層。如果隱藏層數(shù)大于1,應盡量確保每個隱藏層的神經(jīng)單元個數(shù)相同,通常情況下隱藏層神經(jīng)單元的個數(shù)越多越好,即使大量的神經(jīng)單元會導致計算量大的問題。一般來說,每個隱藏層所包含的神經(jīng)單元數(shù)量還應當和輸入X的緯度即特征的數(shù)量相匹配或呈現(xiàn)倍數(shù)關系。
由于我們的輸入是數(shù)字圖像的像素值,并且像素的圖像尺寸為20像素*20像素,因此我們應設置400個輸入層神經(jīng)單元(不包括額外的偏置神經(jīng)元),設置10個輸出層神經(jīng)單元,對應10個數(shù)字類,至于隱藏層,規(guī)定設置隱藏層的層數(shù)為一層,隱藏層的神經(jīng)單元數(shù)量為25個。
- 輸入層:400個神經(jīng)單元
- 隱藏層:25個神經(jīng)單元
- 輸出層:10個神經(jīng)單元
實現(xiàn)過程
import numpy as np
import scipy.io as sio
# 導入 ex3data1.mat 文件數(shù)據(jù)
data = sio.loadmat('ex3data1.mat')
raw_X = data['X']
raw_y = data['y']
為 raw_X 前插入一列值為1的數(shù) ,賦值給 X
X = np.insert(raw_X,0,values=1,axis=1)
X.shape
# (5000, 401)
y = raw_y.flatten()
y.shape
# (5000,)
# 導入 ex3weights.mat 文件數(shù)據(jù)
theta = sio.loadmat('ex3weights.mat')
theta.keys()
# dict_keys(['__header__', '__version__', '__globals__', 'Theta1', 'Theta2'])
獲取到已經(jīng)訓練好的參數(shù)theta1和theta2
theta1 = theta['Theta1']
theta2 = theta['Theta2']
theta1.shape,theta2.shape
# ((25, 401), (10, 26))
定義sigmoid函數(shù)
def sigmoid(z):
return 1/ (1 + np.exp(-z))
向前傳播
a1 = X
z2 = X @theta1.T
a2 = sigmoid(z2)
a2.shape
# (5000, 25)
a2 = np.insert(a2,0,values=1,axis=1)
a2.shape
# (5000, 26)
z3 = a2 @ theta2.T
a3 = sigmoid(z3)
a3.shape
# (5000, 10)
y_pred = np.argmax(a3,axis=1)
y_pred = y_pred + 1
acc = np.mean(y_pred == y)
acc
# 0.9752
a3
# array([[1.12661530e-04, 1.74127856e-03, 2.52696959e-03, ...,
4.01468105e-04, 6.48072305e-03, 9.95734012e-01],
[4.79026796e-04, 2.41495958e-03, 3.44755685e-03, ...,
2.39107046e-03, 1.97025086e-03, 9.95696931e-01],
[8.85702310e-05, 3.24266731e-03, 2.55419797e-02, ...,
6.22892325e-02, 5.49803551e-03, 9.28008397e-01],
...,
[5.17641791e-02, 3.81715020e-03, 2.96297510e-02, ...,
2.15667361e-03, 6.49826950e-01, 2.42384687e-05],
[8.30631310e-04, 6.22003774e-04, 3.14518512e-04, ...,
1.19366192e-02, 9.71410499e-01, 2.06173648e-04],
[4.81465717e-05, 4.58821829e-04, 2.15146201e-05, ...,
5.73434571e-03, 6.96288990e-01, 8.18576980e-02]])
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
