神經網絡——手寫數字識別

這段時間,事很多,心很煩。小編已到杭州三天,學習狀態不是很好,學習斷斷續續,但還是要總結下。


這一個星期都有在斷斷續續學習神經網絡,覺得神經網絡還蠻高大上的,有點高深莫測。


神經網絡之所以叫神經網絡是因爲這個思想來源於人腦處理信息的過程。人腦中有很多很多的神經元,每一個神經元相當於一個計算單位,所有的神經元構成一個網絡,可以處理複雜的信息。


一個簡單的、典型的神經網絡架構如下。




神經網絡不僅可以作用在分類上,也可以作用在迴歸上。本次僅以手寫數字的識別爲例介紹神經網絡的分類作用。


寄郵件都要手寫郵編,在郵局運送郵件的時候都要識別由數字構成的郵編號碼。本次神經網絡的目的就是自動識別手寫的郵編。


第一步:加載訓練數據集。


本次的訓練數據是由大量20*20的圖像像素構成,圖像都是手寫數字的灰度圖。如下所示。




加載數據集的Python代碼如下:


# 讀取以MATLAB矩陣存儲的圖片像素數據集
data = sio.loadmat('data.mat')
X_mat = data['X']
y_mat = data['y']
y = y_mat.reshape([1, 5000])[0]

第二步:數據整理。


數據整理的步驟爲標準化數據和將數據集隨機分成訓練集和測試集。代碼如下:


# 對數據的訓練集進行標準化
ss = StandardScaler()
x_regular = ss.fit_transform(X_mat)

# 隨機分爲訓練集(4500)和測試集(500)
x_train, x_test, y_train, y_test = train_test_split(x_regular, y, test_size=0.1)


第三步:訓練數據。


如果要自己從頭實現神經網絡訓練數據的算法是比較有難度的,本次小編是採用了sklearn的包,只需下面兩段代碼即可。


clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(i,), random_state=1)
clf.fit(x_train, y_train)

到此一個簡單的神經網絡就已經訓練好了,你只要把要識別的數字圖像像素信息傳遞給神經網絡,它便能給出它識別的數字。


爲了探索隱藏層中的結點數的多少對識別率的影響,有如下一段代碼。


'''
對比隱藏層的結點數不同帶來的識別率
'''
def result_by_haddin():
    scores = []
    xlable = []
    for i in range(5, 100, 5):
        clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(i,), random_state=1)
        clf.fit(x_train, y_train)
        r = clf.score(x_test, y_test)
        print(r)
        scores.append(r)
        xlable.append(i)
    plt.plot(xlable, scores)
    plt.title('score change by the neuron numbers of hidden layer')
    plt.show()


繪製出如下一幅圖。



大致來說,結點數越多,識別率較高。爲什麼會出現上下波動的情況呢,我猜想要是能做交叉驗證就可能好一點。


好了,本次的內容就到這裏了,碼字不易,請多多點贊哦。





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