構建多層感知器神經網絡對數字圖片進行文本識別

搞點有意思的?
!!圖像識別✌( •̀ ω •́ )ypython

在Keras環境下構建多層感知器模型,對數字圖像進行精確識別。
模型不消耗大量計算資源,使用了cpu版本的keras,以Tensorflow 做爲backended,在ipython交互環境jupyter notebook中進行編寫。算法

1.數據來源數據庫

在Yann LeCun的博客頁面上下載開源的mnist數據庫:
http://yann.lecun.com/exdb/mn...數組

此數據庫包含四部分:訓練數據集、訓練數據集標籤、測試數據集、測試數據集標籤。因爲訓練模型爲有監督類型的判別模型,所以標籤必不可少。若使用該數據集作k-means聚類,則不須要使用標籤。將數據整合以後放入user\.keras\datasets文件夾以供調用。網絡

也能夠直接從keras建議的url直接下載:
https://s3.amazonaws.com/img-...dom

其中訓練數據集包含了60000張手寫數字的圖片和這些圖片分別對應的標籤;測試數據集包含了10000張手寫數字的圖片和這些圖片分別對應的標籤.函數

clipboard.png

clipboard.png
clipboard.png

2.數據格式和前期處理(在此不涉及)
訓練數據集包含60000張圖片,測試數據集包含10000張,全部圖片都被當量化爲28pixel*28pixel的大小。爲減小向量長度,將圖片灰度處理,每一個像素用一個RGB值表示(0~255),這是由於灰度處理後的RGB值加了歸一約束,向量長度相是灰度處理前的1/3。至此,每一個圖片均可以用28*28的向量表示。工具

3.導入依賴庫學習

打開jupyter notebook後導入依賴庫numpy,此處的seed爲隨機量的標籤,可隨意設置:測試

from __future__ import print_function
import numpy as np
np.random.seed(9999)

繼續從keras中導入使用到的模塊:

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD, Adam, RMSprop
from keras.utils import np_utils

mnist爲以前準備的數據集,Dense爲全鏈接神經元層,Dropout爲神經元輸入的斷接率,Activation爲神經元層的激勵函數設置。

導入繪圖工具,以便以後繪製模型簡化圖:

from keras.utils.vis_utils import plot_model as plot

4.處理導入的數據集

處理數據集
1.爲了符合神經網絡對輸入數據的要求,本來爲60000*28*28shape的三維ndarray,改變成了尺寸爲60000*784的2維數組,每行爲一個example,每一列爲一個feature。
3.神經網絡用到大量線性與求導運算,將輸入的feature的數值類型改變爲32位float。
3.將feature值歸一化,本來0~255的feature歸一爲0~1。
4.測試數據集同理。

(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(60000, 28*28)
X_test = X_test.reshape(10000, 28*28)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

處理標籤
文本識別問題本質是一個多元分類問題。將類向量轉換爲二進制數表示的類矩陣,其中每一行都是每個example對應一個label。label爲10維向量,每一位表明了此label對應的example屬於特定類(0~10)的機率。此時Y_train爲60000*10的向量,Y_test爲10000*10的向量

Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

5.用keras創建神經網絡模型

batch_size = 128
nb_classes = 10
nb_epoch = 20
model = Sequential()
model.add(Dense(500, input_shape=(28*28,)))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(500))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(500))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(10))
model.add(Activation('softmax'))

每次iter時,每一批次梯度降低運算所包含的example數量爲128;
softmax輸出值爲10維向量;
一共迭代20次iteration。

三層的神經網絡,其中輸入層爲28*28=784維的全鏈接層。
Hidden Layer有3層,每一層有500個神經元,input layer->hidden layer->output layer都是全鏈接方式(DENSE)。

hidden layer的激活函數採用ReLu函數,表達式:
clipboard.png
以下圖所示:
clipboard.png
相比與傳統的sigmoid函數,ReLU更容易學習優化。由於其分段線性性質,致使其前傳、後傳、求導都是分段線性。而傳統的sigmoid函數,因爲兩端飽和,在傳播過程當中容易丟棄信息。且Relu在x<0時所映射的值永遠是0,所以可稀疏掉負的feature。

文本識別本質是多元分類(此處爲10元分類),所以輸出層採用softmax函數進行feature處理,以下圖所示:
clipboard.png
其中第j個輸出層神經元輸出值與當層輸入feature的關係爲:
clipboard.png

該神經網絡示意圖如圖所示:

clipboard.png

調用summary方法作一個總覽:

model.summary()

結果以下:

clipboard.png

該神經網絡一共有898510個參數,即在後向反饋過程當中,每一次用梯度降低都要求898510次導數。

用plot函數打印model:

plot(model, to_file='mlp_model.png',show_shapes=True)

以下圖所示:

clipboard.png

編譯模型,使用cross_entropy交叉熵函數做爲loss function,公式以下圖所示:

clipboard.png

用交叉熵可量化輸出向量與標籤向量的差別,p與q分別爲輸出向量與標籤向量。對於每個example,其交叉熵值就是要經過迭代儘可能往小優化的值。優過程使用梯度算法,計算過程當中使用反向傳播算法求導。
交叉熵的做用以下圖所示:

clipboard.png

在此分類神經網絡中,使用判別結果的accuracy做爲參數值好壞的度量標準。

6.用數據訓練和測試網絡

history = model.fit(X_train, Y_train,
                    batch_size=batch_size, nb_epoch=nb_epoch,
                    verbose=1, validation_data=(X_test, Y_test))

在這個地方運行碰到warning,緣由是最新版的keras使用的iteration參數名改爲了epoch,而非以前沿用的nb_epoch。將上面的代碼做修改便可。

訓練結果以下所示。第一次迭代,經過對60000/128個的batch訓練,已經達到了比較好的結果,accuracy已經高達0.957。以後Loss值繼續降低,精確度繼續上升。從第9個itearation開始,loss函數值(交叉熵cross_entropy)開始震盪在0.05附近,accuracy保持在0.98以上。說明前9次迭代就已經訓練了足夠好的θ值和bias,不須要後11次訓練。

clipboard.png

7.評估模型

用score函數打印模型評估結果:

score = model.evaluate(X_test, Y_test, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])

輸出結果以下圖所示:

clipboard.png

訓練的multi-layer_perceptron神經網絡在對數字文本識別時具備98.12%的準確率。

手寫數字圖片數據庫和Iris_Flower_dataset同樣,算是dl界的基本素材,能夠拿來作不少事情,好比k-means聚類,LSTM(長短記憶網絡)。

相關文章
相關標籤/搜索