摘要:搞點有意思的圖像識別在環(huán)境下構(gòu)建多層感知器模型,對數(shù)字圖像進行精確識別。對于每一個,其交叉熵值就是要通過迭代盡量往小優(yōu)化的值。交叉熵的作用如下圖所示在此分類神經(jīng)網(wǎng)絡(luò)中,使用判別結(jié)果的作為參數(shù)值好壞的度量標準。
搞點有意思的?
??!圖像識別?( ?? ω ?? )y
在Keras環(huán)境下構(gòu)建多層感知器模型,對數(shù)字圖像進行精確識別。
模型不消耗大量計算資源,使用了cpu版本的keras,以Tensorflow 作為backended,在ipython交互環(huán)境jupyter notebook中進行編寫。
1.數(shù)據(jù)來源
在Yann LeCun的博客頁面上下載開源的mnist數(shù)據(jù)庫:
http://yann.lecun.com/exdb/mn...
此數(shù)據(jù)庫包含四部分:訓練數(shù)據(jù)集、訓練數(shù)據(jù)集標簽、測試數(shù)據(jù)集、測試數(shù)據(jù)集標簽。由于訓練模型為有監(jiān)督類型的判別模型,因此標簽必不可少。若使用該數(shù)據(jù)集做k-means聚類,則不需要使用標簽。將數(shù)據(jù)整合之后放入user.kerasdatasets文件夾以供調(diào)用。
也可以直接從keras建議的url直接下載:
https://s3.amazonaws.com/img-...
其中訓練數(shù)據(jù)集包含了60000張手寫數(shù)字的圖片和這些圖片分別對應的標簽;測試數(shù)據(jù)集包含了10000張手寫數(shù)字的圖片和這些圖片分別對應的標簽.
2.數(shù)據(jù)格式和前期處理(在此不涉及)
訓練數(shù)據(jù)集包含60000張圖片,測試數(shù)據(jù)集包含10000張,所有圖片都被當量化為28pixel*28pixel的大小。為減少向量長度,將圖片灰度處理,每個像素用一個RGB值表示(0~255),這是因為灰度處理后的RGB值加了歸一約束,向量長度相是灰度處理前的1/3。至此,每個圖片都可以用28*28的向量表示。
3.導入依賴庫
打開jupyter notebook后導入依賴庫numpy,此處的seed為隨機量的標簽,可隨意設(shè)置:
from __future__ import print_function import numpy as np np.random.seed(9999)
繼續(xù)從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為之前準備的數(shù)據(jù)集,Dense為全連接神經(jīng)元層,Dropout為神經(jīng)元輸入的斷接率,Activation為神經(jīng)元層的激勵函數(shù)設(shè)置。
導入繪圖工具,以便之后繪制模型簡化圖:
from keras.utils.vis_utils import plot_model as plot
4.處理導入的數(shù)據(jù)集
處理數(shù)據(jù)集
1.為了符合神經(jīng)網(wǎng)絡(luò)對輸入數(shù)據(jù)的要求,原本為60000*28*28shape的三維ndarray,改變成了尺寸為60000*784的2維數(shù)組,每行為一個example,每一列為一個feature。
3.神經(jīng)網(wǎng)絡(luò)用到大量線性與求導運算,將輸入的feature的數(shù)值類型改變?yōu)?2位float。
3.將feature值歸一化,原本0~255的feature歸一為0~1。
4.測試數(shù)據(jù)集同理。
(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
處理標簽
文本識別問題本質(zhì)是一個多元分類問題。將類向量轉(zhuǎn)換為二進制數(shù)表示的類矩陣,其中每一行都是每一個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建立神經(jīng)網(wǎng)絡(luò)模型
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數(shù)量為128;
softmax輸出值為10維向量;
一共迭代20次iteration。
三層的神經(jīng)網(wǎng)絡(luò),其中輸入層為28*28=784維的全連接層。
Hidden Layer有3層,每一層有500個神經(jīng)元,input layer->hidden layer->output layer都是全連接方式(DENSE)。
hidden layer的激活函數(shù)采用ReLu函數(shù),表達式:
如下圖所示:
相比與傳統(tǒng)的sigmoid函數(shù),ReLU更容易學習優(yōu)化。因為其分段線性性質(zhì),導致其前傳、后傳、求導都是分段線性。而傳統(tǒng)的sigmoid函數(shù),由于兩端飽和,在傳播過程中容易丟棄信息。且Relu在x<0時所映射的值永遠是0,因此可稀疏掉負的feature。
文本識別本質(zhì)是多元分類(此處為10元分類),因此輸出層采用softmax函數(shù)進行feature處理,如下圖所示:
其中第j個輸出層神經(jīng)元輸出值與當層輸入feature的關(guān)系為:
該神經(jīng)網(wǎng)絡(luò)示意圖如圖所示:
調(diào)用summary方法做一個總覽:
model.summary()
結(jié)果如下:
該神經(jīng)網(wǎng)絡(luò)一共有898510個參數(shù),即在后向反饋過程中,每一次用梯度下降都要求898510次導數(shù)。
用plot函數(shù)打印model:
plot(model, to_file="mlp_model.png",show_shapes=True)
如下圖所示:
編譯模型,使用cross_entropy交叉熵函數(shù)作為loss function,公式如下圖所示:
用交叉熵可量化輸出向量與標簽向量的差異,p與q分別為輸出向量與標簽向量。對于每一個example,其交叉熵值就是要通過迭代盡量往小優(yōu)化的值。優(yōu)過程使用梯度算法,計算過程中使用反向傳播算法求導。
交叉熵的作用如下圖所示:
在此分類神經(jīng)網(wǎng)絡(luò)中,使用判別結(jié)果的accuracy作為參數(shù)值好壞的度量標準。
6.用數(shù)據(jù)訓練和測試網(wǎng)絡(luò)
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參數(shù)名改成了epoch,而非之前沿用的nb_epoch。將上面的代碼作修改即可。
訓練結(jié)果如下所示。第一次迭代,通過對60000/128個的batch訓練,已經(jīng)達到了比較好的結(jié)果,accuracy已經(jīng)高達0.957。之后Loss值繼續(xù)下降,精確度繼續(xù)上升。從第9個itearation開始,loss函數(shù)值(交叉熵cross_entropy)開始震蕩在0.05附近,accuracy保持在0.98以上。說明前9次迭代就已經(jīng)訓練了足夠好的θ值和bias,不需要后11次訓練。
7.評估模型
用score函數(shù)打印模型評估結(jié)果:
score = model.evaluate(X_test, Y_test, verbose=0) print("Test score:", score[0]) print("Test accuracy:", score[1])
輸出結(jié)果如下圖所示:
訓練的multi-layer_perceptron神經(jīng)網(wǎng)絡(luò)在對數(shù)字文本識別時具有98.12%的準確率。
手寫數(shù)字圖片數(shù)據(jù)庫和Iris_Flower_dataset一樣,算是dl界的基本素材,可以拿來做很多事情,比如k-means聚類,LSTM(長短記憶網(wǎng)絡(luò))。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/40769.html
摘要:此原因在一定程度上阻礙了深度學習的發(fā)展,并將大多數(shù)機器學習和信號處理研究,從神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)移到相對較容易訓練的淺層學習結(jié)構(gòu)。深度學習算法可以看成核機器學習中一個優(yōu)越的特征表示方法。 摘要:深度學習是一類新興的多層神經(jīng)網(wǎng)絡(luò)學習算法。因其緩解了傳統(tǒng)訓練算法的局部最小性, 引起機器學習領(lǐng)域的廣泛關(guān)注。首先論述了深度學習興起淵源, 分析了算法的優(yōu)越性, 并介紹了主流學習算法及應用現(xiàn)狀,最后總結(jié)當前存在的...
閱讀 2680·2021-11-25 09:43
閱讀 2594·2021-11-22 09:34
閱讀 2863·2021-11-12 10:34
閱讀 1452·2021-10-20 13:46
閱讀 2310·2019-08-30 13:21
閱讀 940·2019-08-30 11:21
閱讀 493·2019-08-30 11:20
閱讀 2199·2019-08-29 17:20