構建多層感知器神經網路對數字圖片進行文字識別
在Keras環境下構建多層感知器模型,對數字影象進行精確識別。
模型不消耗大量計算資源,使用了cpu版本的keras,以Tensorflow 作為backended,在ipython互動環境jupyter notebook中進行編寫。
1.資料來源
此資料庫包含四部分:訓練資料集、訓練資料集標籤、測試資料集、測試資料集標籤。由於訓練模型為有監督型別的判別模型,因此標籤必不可少。若使用該資料集做k-means聚類,則不需要使用標籤。將資料整合之後放入user\.keras\datasets資料夾以供呼叫。
其中訓練資料集包含了60000張手寫數字的圖片和這些圖片分別對應的標籤;測試資料集包含了10000張手寫數字的圖片和這些圖片分別對應的標籤.
2.資料格式和前期處理(在此不涉及)
訓練資料集包含60000張圖片,測試資料集包含10000張,所有圖片都被當量化為28pixel*28pixel的大小。為減少向量長度,將圖片灰度處理,每個畫素用一個RGB值表示(0~255),這是因為灰度處理後的RGB值加了歸一約束,向量長度相是灰度處理前的1/3。至此,每個圖片都可以用28*28的向量表示。
3.匯入依賴庫
開啟jupyter notebook後匯入依賴庫numpy,此處的seed為隨機量的標籤,可隨意設定:
Python123 | from__future__importprint_functionimportnumpy asnpnp.random.seed(9999) |
繼續從keras中匯入使用到的模組:
Python12345 | fromkeras.datasets importmnistfromkeras.models importSequentialfromkeras.layers.core importDense,Dropout,Activationfromkeras.optimizers importSGD,Adam,RMSpropfromkeras.utils importnp_utils |
mnist為之前準備的資料集,Dense為全連線神經元層,Dropout為神經元輸入的斷接率,Activation為神經元層的激勵函式設定。
匯入繪圖工具,以便之後繪製模型簡化圖:
Python1 | fromkeras.utils.vis_utils importplot_model asplot |
4.處理匯入的資料集
處理資料集
- 為了符合神經網路對輸入資料的要求,原本為60000*28*28shape的三維ndarray,改變成了尺寸為60000*784的2維陣列,每行為一個example,每一列為一個feature。
- 神經網路用到大量線性與求導運算,將輸入的feature的數值型別改變為32位float。
- 將feature值歸一化,原本0~255的feature歸一為0~1。
- 測試資料集同理。
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的向量
Python12 | Y_train=np_utils.to_categorical(y_train,nb_classes)Y_test=np_utils.to_categorical(y_test,nb_classes) |
5.用keras建立神經網路模型
Python123456789101112131415 | 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函式,表示式:
相比與傳統的sigmoid函式,ReLU更容易學習優化。因為其分段線性性質,導致其前傳、後傳、求導都是分段線性。而傳統的sigmoid函式,由於兩端飽和,在傳播過程中容易丟棄資訊。且Relu在x
文字識別本質是多元分類(此處為10元分類),因此輸出層採用softmax函式進行feature處理,如下圖所示:
其中第j個輸出層神經元輸出值與當層輸入feature的關係為:
呼叫summary方法做一個總覽:
Python1 | model.summary() |
結果如下:
該神經網路一共有898510個引數,即在後向反饋過程中,每一次用梯度下降都要求898510次導數。
用plot函式列印model:
Python1 | plot(model,to_file='mlp_model.png',show_shapes=True) |
如下圖所示:
編譯模型,使用cross_entropy交叉熵函式作為loss function,公式如下圖所示:
用交叉熵可量化輸出向量與標籤向量的差異,p與q分別為輸出向量與標籤向量。對於每一個example,其交叉熵值就是要通過迭代儘量往小優化的值。優過程使用梯度演算法,計算過程中使用反向傳播演算法求導。
交叉熵的作用如下圖所示:
在此分類神經網路中,使用判別結果的accuracy作為引數值好壞的度量標準。
6.用資料訓練和測試網路
Python123 | 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次訓練。
7.評估模型
用score函式列印模型評估結果:
Python123 | score=model.evaluate(X_test,Y_test,verbose=0)print('Test score:',score[0])print('Test accuracy:',score[1]) |
輸出結果如下圖所示:
訓練的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)
早前已經學習了感知器學習演算法,主要通過對那些錯分類的樣本進行求和來表示對錯分樣本的懲罰,但明顯的它是一個線性的判別函式;而且上節學到了感知器神經元(閾值邏輯單元),對於單個的感知器神經元來說,儘管它能夠實現線性可分資料的分類問題(如與、或問題),但是卻無法解