1. 程式人生 > >構建多層感知器神經網路對數字圖片進行文字識別

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

在Keras環境下構建多層感知器模型,對數字影象進行精確識別。

模型不消耗大量計算資源,使用了cpu版本的keras,以Tensorflow 作為backended,在ipython互動環境jupyter notebook中進行編寫。

1.資料來源

此資料庫包含四部分:訓練資料集、訓練資料集標籤、測試資料集、測試資料集標籤。由於訓練模型為有監督型別的判別模型,因此標籤必不可少。若使用該資料集做k-means聚類,則不需要使用標籤。將資料整合之後放入user\.keras\datasets資料夾以供呼叫。

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

1068837024-599c8e667e5f4_articlex

1068837024-599c8e667e5f4_articlex2309602036-599c8ecba50ff_articlex

2.資料格式和前期處理(在此不涉及)

訓練資料集包含60000張圖片,測試資料集包含10000張,所有圖片都被當量化為28pixel*28pixel的大小。為減少向量長度,將圖片灰度處理,每個畫素用一個RGB值表示(0~255),這是因為灰度處理後的RGB值加了歸一約束,向量長度相是灰度處理前的1/3。至此,每個圖片都可以用28*28的向量表示。

3.匯入依賴庫

開啟jupyter notebook後匯入依賴庫numpy,此處的seed為隨機量的標籤,可隨意設定:

Python
123 from__future__importprint_functionimportnumpy asnpnp.random.seed(9999)

繼續從keras中匯入使用到的模組:

Python
12345 fromkeras.datasets importmnistfromkeras.models importSequentialfromkeras.layers.core importDense,Dropout,Activationfromkeras.optimizers importSGD,Adam,RMSpropfromkeras.utils importnp_utils

mnist為之前準備的資料集,Dense為全連線神經元層,Dropout為神經元輸入的斷接率,Activation為神經元層的激勵函式設定。

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

Python
1 fromkeras.utils.vis_utils importplot_model asplot

4.處理匯入的資料集

處理資料集

  1. 為了符合神經網路對輸入資料的要求,原本為60000*28*28shape的三維ndarray,改變成了尺寸為60000*784的2維陣列,每行為一個example,每一列為一個feature。
  2. 神經網路用到大量線性與求導運算,將輸入的feature的數值型別改變為32位float。
  3. 將feature值歸一化,原本0~255的feature歸一為0~1。
  4. 測試資料集同理。
Python
1234567 (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/=255X_test/=255

處理標籤

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

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

5.用keras建立神經網路模型

Python
123456789101112131415 batch_size=128nb_classes=10nb_epoch=20model=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函式,表示式:

1068837024-599c8e667e5f4_articlex如下圖所示:

1068837024-599c8e667e5f4_articlex
相比與傳統的sigmoid函式,ReLU更容易學習優化。因為其分段線性性質,導致其前傳、後傳、求導都是分段線性。而傳統的sigmoid函式,由於兩端飽和,在傳播過程中容易丟棄資訊。且Relu在x

文字識別本質是多元分類(此處為10元分類),因此輸出層採用softmax函式進行feature處理,如下圖所示:

1068837024-599c8e667e5f4_articlex
其中第j個輸出層神經元輸出值與當層輸入feature的關係為:

1068837024-599c8e667e5f4_articlex該神經網路示意圖如圖所示:

1068837024-599c8e667e5f4_articlex

呼叫summary方法做一個總覽:

Python
1 model.summary()

結果如下:

1068837024-599c8e667e5f4_articlex

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

用plot函式列印model:

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

如下圖所示:

1068837024-599c8e667e5f4_articlex

編譯模型,使用cross_entropy交叉熵函式作為loss function,公式如下圖所示:

1068837024-599c8e667e5f4_articlex

用交叉熵可量化輸出向量與標籤向量的差異,p與q分別為輸出向量與標籤向量。對於每一個example,其交叉熵值就是要通過迭代儘量往小優化的值。優過程使用梯度演算法,計算過程中使用反向傳播演算法求導。

交叉熵的作用如下圖所示:

1068837024-599c8e667e5f4_articlex

在此分類神經網路中,使用判別結果的accuracy作為引數值好壞的度量標準。

6.用資料訓練和測試網路

Python
123 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次訓練。

1068837024-599c8e667e5f4_articlex

7.評估模型

用score函式列印模型評估結果:

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

輸出結果如下圖所示:

1068837024-599c8e667e5f4_articlex

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

手寫數字圖片資料庫和Iris_Flower_dataset一樣,算是dl界的基本素材,可以拿來做很多事情,比如k-means聚類,LSTM(長短記憶網路)。

相關推薦

構建感知神經網路數字圖片進行文字識別

在Keras環境下構建多層感知器模型,對數字影象進行精確識別。 模型不消耗大量計算資源,使用了cpu版本的keras,以Tensorflow 作為backended,在ipython互動環境jupyter notebook中進行編寫。 1.資料來源 此資料庫包含四部分:訓練資

keras中使用MLP(感知機)神經網路來實現MNIST手寫體識別

    Keras是一個基於python的的深度學習框架,比tensorflow更簡單易用,適合入門學習,本篇文章主要介紹使用keras實現手寫體識別任務。環境為python3+,Keras2.1,神經網路基礎知識在此不做過多介紹。    1.    載入MNIST資料。方式

MLP(感知神經網路

由前面介紹看到,單個感知器能夠完成線性可分資料的分類問題,是一種最簡單的可以“學習”的機器。但他無法解決非線性問題。比如下圖中的XOR問題:即(1,1)(-1,-1)屬於同一類,而(1,-1)(-1,1)屬於第二類的問題,不能由單個感知器正確分類。 即在Minsky和Papert的專著《感知器》所分

Spark中基於神經網路的MLPC(感知分類)的使用

本文首發於我的個人部落格QIMING.INFO,轉載請帶上鍊接及署名。 MLPC(Multilayer Perceptron Classifier),多層感知器分類器,是一種基於前饋人工神經網路(ANN)的分類器。Spark中目前僅支援此種與神經網路有關的演算

神經網路/感知(MLP)架構:選擇隱藏數量和大小的標準

隱藏層個數: 一個零隱藏層的模型可以解決線性可分資料。所以除非你早知道你的資料線性不可分,證明它也沒什麼壞處—為什麼使用比任務需求更困難的模型?如果它是線性可分的那麼一個更簡單的技術可以工作,感知器也可以。 假設您的資料確實需要通過非線性技術進行分離,則始終

【Python-ML】神經網路-感知增加梯度檢驗

# -*- coding: utf-8 -*- ''' Created on 2018年1月26日 @author: Jason.F @summary: 多層感知器實現,加梯度檢驗 訓練集:http://yann.lecun.com/exdb/mnist/ train-im

感知到卷積網路(二)

上一篇中,我們講解了什麼是MLP以及如何訓練得到一個MLP,讀者大概對神經網路有一定的印象了。我們總說,好戲在後頭,接下來這一大塊頭,我們將重點介紹卷積網路。 何謂卷積 單憑卷積這一個稱號大概可以嚇死一半的普通老百姓了。一開始接觸卷積網路的時候,我就差點

感知識別手寫數字算法程序

itl cti val shape erb ase 鏈接 n) frame 1 #coding=utf-8 2 #1.數據預處理 3 import numpy as np #導入模塊,numpy是擴展鏈接庫 4 import pan

Keras感知:印第安糖尿病人診斷

例項中使用的是Pima Indians Diabetes資料集,資料集有八項屬性和對應輸出: (1)懷孕次數 (2)2小時口服葡萄糖耐量實驗中血漿葡萄糖濃度 (3)舒張壓 (4)三頭肌皮褶皺厚度 (5)2小時血清胰島素 (6)身體質量指數 (7)糖尿病譜系功能 (8)

國際旅行人數預測——使用感知

這個例子是使用多層感知器來處理時間序列問題,例子來源於魏貞原老師的書。 資料集使用的是國際旅行旅客人數資料集(international-airline-passengers) 資料集下載:國際旅行旅客人數資料集(international-airline-passengers) 利用m

theano 感知模型

本節要用Theano實現的結構是一個隱層的多層感知器模型(MLP)。MLP可以看成一種對數迴歸器,其中輸入通過非線性轉移矩陣ΦΦ做一個變換處理,以便於把輸入資料投影到一個線性可分的空間上。MLP的中間層一般稱為隱層。單一的隱層便可以確保MLP全域性近似。然而,我們稍後還會

【深度學習】感知解決異或問題

利用Python 建立兩層感知器,利用W-H學習規則訓練網路權值: #!/usr/bin/env python # -*- coding:utf-8 -*- import random import numpy as np import matplotl

keras感知識別手寫數字

2.Keras建立多層感知器模型(接上一篇) 2.1簡單介紹多層感知器模型 注:以下模型及其說明來自於《TensorFlow+Keras深度學習人工智慧實踐應用》林大貴 著 以矩陣方式模擬多層感知器模型的工作方式(如下圖所示) 建立輸入與隱藏層的公式: h1=

Keras感知例項:印第安人糖尿病診斷

本例項使用Keras在python中建立一個神經網路模型,這是一個簡單的貫序模型,也是神經網路最常見的模型。本例項按照以下步驟建立: 1. 匯入資料。 2.定義模型 3.編譯模型 4.訓練模型 5.評估模型 6.彙總程式碼 Pima Indians糖尿病發病情況

scikit-learn中的感知呼叫模型輸出資料型別為float出現Unknown label type: 'unknown'

受下面截圖的啟發,說的意思好像是輸出型別必須是絕對的(categorical),train_y後加上astype(‘int’)即可,fit(train_x,train_y.astype(‘int’)),但是不能試astype('float'),用這個還是會報錯,具體原因我不清楚,解決方法就是把輸出資

sknn感知定義——sknn.mlp.MultiLayerPerceptron

sknn.mlp.MultiLayerPerceptron class sknn.mlp.MultiLayerPerceptron(layers, warning=None, parameters=N

資料探勘——感知手寫體識別的Python實現

# coding=utf-8 from sklearn.datasets import load_digits from sklearn.cross_validation import train_test_split, cross_val_score fro

邏輯斯第迴歸、softmax分類與感知

本專欄將推出一系列深度學習與影象處理相關的教程文章。注重原理精講和程式碼實現。實現框架將重點選擇Tensorflow或Pytorch。本講從邏輯斯第迴歸入手,然後講解softmax分類器,最後講解多層感知器。文末提供註釋詳盡的Tensorflow程式碼實現。

資料探勘——感知演算法簡介

XOR(抑或)是一種非線性函式,不能被線性可分 人工神經網路簡介 人工神經網路由三部分組成: - 架構:描述神經元的層次與連線神經元的結構 - 激勵函式 - 找出最優權重值的學習演算法 人工神經網路主要型別: 1. 前饋神經網路:最常用

模式識別(Pattern Recognition)學習筆記(十九)--感知模型(MLP)

       早前已經學習了感知器學習演算法,主要通過對那些錯分類的樣本進行求和來表示對錯分樣本的懲罰,但明顯的它是一個線性的判別函式;而且上節學到了感知器神經元(閾值邏輯單元),對於單個的感知器神經元來說,儘管它能夠實現線性可分資料的分類問題(如與、或問題),但是卻無法解