Python MNIST手寫體識別詳解與試練
【人工智能項目】MNIST手寫體識別實驗及分析
1.實驗內(nèi)容簡述
1.1 實驗環(huán)境
本實驗采用的軟硬件實驗環(huán)境如表所示:
在Windows操作系統(tǒng)下,采用基于Tensorflow的Keras的深度學(xué)習(xí)框架,對MNIST進行訓(xùn)練和測試。
采用keras的深度學(xué)習(xí)框架,keras是一個專為簡單的神經(jīng)網(wǎng)絡(luò)組裝而設(shè)計的Python庫,具有大量預(yù)先包裝的網(wǎng)絡(luò)類型,包括二維和三維風(fēng)格的卷積網(wǎng)絡(luò)、短期和長期的網(wǎng)絡(luò)以及更廣泛的一般網(wǎng)絡(luò)。使用keras構(gòu)建網(wǎng)絡(luò)是直接的,keras在其Api設(shè)計中使用的語義是面向?qū)哟蔚?,網(wǎng)絡(luò)組建相對直觀,所以本次選用Keras人工智能框架,其專注于用戶友好,模塊化和可擴展性。
1.2 MNIST數(shù)據(jù)集介紹
MNIST(官方網(wǎng)站)是非常有名的手寫體數(shù)字識別數(shù)據(jù)集。它由手寫體數(shù)字的圖片和相對應(yīng)的標(biāo)簽組成,如:
MNIST數(shù)據(jù)集分為訓(xùn)練圖像和測試圖像。訓(xùn)練圖像60000張,測試圖像10000張,每一個圖片代表0-9中的一個數(shù)字,且圖片大小均為28*28的矩陣。
- train-images-idx3-ubyte.gz: training set images (9912422 bytes) 訓(xùn)練圖片
- train-labels-idx1-ubyte.gz: training set labels (28881 bytes) 訓(xùn)練標(biāo)簽
- t10k-images-idx3-ubyte.gz: test set images (1648877 bytes) 測試圖片
- t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes) 測試標(biāo)簽
1.3 數(shù)據(jù)預(yù)處理
數(shù)據(jù)預(yù)處理階段對圖像進行歸一化處理,我們將圖片中的這些值縮小到 0 到 1 之間,然后將其饋送到神經(jīng)網(wǎng)絡(luò)模型。為此,將圖像組件的數(shù)據(jù)類型從整數(shù)轉(zhuǎn)換為浮點數(shù),然后除以 255。這樣更容易訓(xùn)練,以下是預(yù)處理圖像的函數(shù):務(wù)必要以相同的方式對訓(xùn)練集和測試集進行預(yù)處理:
之后對標(biāo)簽進行one-hot編碼處理:將離散特征的取值擴展到了歐式空間,離散特征的某個取值就對應(yīng)歐式空間的某個點;機器學(xué)習(xí)算法中,特征之間距離的計算或相似度的常用計算方法都是基于歐式空間的;將離散型特征使用one-hot編碼,會讓特征之間的距離計算更加合理
2.實驗核心代碼
(1)MLP感知器
# Build MLP model = Sequential() model.add(Dense(units=256, input_dim=784, kernel_initializer='normal', activation='relu')) model.add(Dense(units=128, kernel_initializer='normal', activation='relu')) model.add(Dense(units=64, kernel_initializer='normal', activation='relu')) model.add(Dense(units=10, kernel_initializer='normal', activation='softmax')) model.summary()
(2)CNN卷積神經(jīng)網(wǎng)絡(luò)
# Build LeNet-5 model = Sequential() model.add(Conv2D(filters=6, kernel_size=(5, 5), padding='valid', input_shape=(28, 28, 1), activation='relu')) # C1 model.add(MaxPooling2D(pool_size=(2, 2))) # S2 model.add(Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation='relu')) # C3 model.add(MaxPooling2D(pool_size=(2, 2))) # S4 model.add(Flatten()) model.add(Dense(120, activation='tanh')) # C5 model.add(Dense(84, activation='tanh')) # F6 model.add(Dense(10, activation='softmax')) # output model.summary()
模型解釋
模型訓(xùn)練過程中,我們用到LENET-5的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。
第一層,卷積層
這一層的輸入是原始的圖像像素,LeNet-5 模型接受的輸入層大小是28x28x1。第一卷積層的過濾器的尺寸是5x5,深度(卷積核種類)為6,不使用全0填充,步長為1。因為沒有使用全0填充,所以這一層的輸出的尺寸為32-5+1=28,深度為6。這一層卷積層參數(shù)個數(shù)是5x5x1x6+6=156個參數(shù)(可訓(xùn)練參數(shù)),其中6個為偏置項參數(shù)。因為下一層的節(jié)點矩陣有有28x28x6=4704個節(jié)點(神經(jīng)元數(shù)量),每個節(jié)點和5x5=25個當(dāng)前層節(jié)點相連,所以本層卷積層總共有28x28x6x(5x5+1)個連接。
第二層,池化層
這一層的輸入是第一層的輸出,是一個28x28x6=4704的節(jié)點矩陣。本層采用的過濾器為2x2的大小,長和寬的步長均為2,所以本層的輸出矩陣大小為14x14x6。原始的LeNet-5 模型中使用的過濾器和這里將用到的過濾器有些許的差別,這里不過多介紹。
第三層,卷積層
本層的輸入矩陣大小為14x14x6,使用的過濾器大小為5x5,深度為16。本層不使用全0填充,步長為1。本層的輸出矩陣大小為10x10x16。按照標(biāo)準(zhǔn)卷積層本層應(yīng)該有5x5x6x16+16=2416個參數(shù)(可訓(xùn)練參數(shù)),10x10x16x(5x5+1)=41600個連接。
第四層,池化層
本層的輸入矩陣大小是10x10x16,采用的過濾器大小是2x2,步長為2,本層的輸出矩陣大小為5x5x16。
第五層,全連接層
本層的輸入矩陣大小為5x5x16。如果將此矩陣中的節(jié)點拉成一個向量,那么這就和全連接層的輸入一樣了。本層的輸出節(jié)點個數(shù)為120,總共有5x5x16x120+120=48120個參數(shù)。
第六層,全連接層
本層的輸入節(jié)點個數(shù)為120個,輸出節(jié)點個數(shù)為84個,總共參數(shù)為120x84+84=10164個。
第七層,全連接層
LeNet-5 模型中最后一層輸出層的結(jié)構(gòu)和全連接層的結(jié)構(gòu)有區(qū)別,但這里我們用全連接層近似的表示。本層的輸入節(jié)點為84個,輸出節(jié)點個數(shù)為10個,總共有參數(shù)84x10+10=850個。
模型過程
初始參數(shù)設(shè)定好之后開始訓(xùn)練,每次訓(xùn)練需要微調(diào)參數(shù)以得到更好的訓(xùn)練結(jié)果,經(jīng)過多次嘗試,最終設(shè)定參數(shù)為:
- 優(yōu)化器:adam優(yōu)化器
- 訓(xùn)練輪數(shù):10
- 每次輸入的數(shù)據(jù)量:500
LENET-5的卷積神經(jīng)網(wǎng)絡(luò)對MNIST數(shù)據(jù)集進行訓(xùn)練,并采用上述的模型參數(shù),進行10輪訓(xùn)練,在訓(xùn)練集上達到了95%的準(zhǔn)確率
3.結(jié)果分析機器總結(jié)
3.1 模型測試以及結(jié)果分析
為了驗證模型的魯棒性,在上述最優(yōu)參數(shù)下保存在驗證集上性能最好的模型,在測試集上進行最終的測試,得到最終的準(zhǔn)確率為:95.13%.
為了更好的分析我們的結(jié)果,這里用混淆矩陣來評估我們的模型性能。在模型評估之前,先學(xué)習(xí)一些指標(biāo)。
TP(True Positive):將正類預(yù)測為正類數(shù),真實為0,預(yù)測也為0FN(False Negative):將正類預(yù)測為負(fù)類數(shù),真實為0,預(yù)測為1FP(False Positive):將負(fù)類預(yù)測為正類數(shù), 真實為1,預(yù)測為0。TN(True Negative):將負(fù)類預(yù)測為負(fù)類數(shù),真實為1,預(yù)測也為1混淆矩陣定義及表示含義:
混淆矩陣是機器學(xué)習(xí)中總結(jié)分類模型預(yù)測結(jié)果的情形分析表,以矩陣形式將數(shù)據(jù)集中的記錄按照真實的類別與分類模型預(yù)測的類別判斷兩個標(biāo)準(zhǔn)進行匯總。其中矩陣的行表示真實值,矩陣的列表示預(yù)測值,下面以本次案例為例,看下矩陣表現(xiàn)形式,如下:
3.2 結(jié)果對比
并與四層全連接層模型進行對比,全連接層的模型結(jié)構(gòu)如下:
其結(jié)果如下:
總之,從結(jié)果上來看,最后經(jīng)過不斷地參數(shù)調(diào)優(yōu)最終訓(xùn)練出了一個分類正確率在95%左右的模型,并且通過實驗證明了模型具有很強的魯棒性。
3.3 模型的預(yù)測
對單張圖像進行預(yù)測:
4 總結(jié)
本文通過對卷積神經(jīng)網(wǎng)絡(luò)的研究流程分析,提出了一套完整的卷積神經(jīng)網(wǎng)絡(luò)MNIST手寫體識別流程并也將本文的數(shù)據(jù)集分類正確率提高到95%的水平;其次,本文構(gòu)建的模型是具有普適性的,可以稍加改進就應(yīng)用于不同的數(shù)據(jù)集進行特征提取及分類。再次,本文在構(gòu)建模型的過程中綜合考慮了計算資源和時間成本,構(gòu)建的卷積神經(jīng)網(wǎng)絡(luò)模型在普通的個人筆記本上即可進行訓(xùn)練,此外還增加了MLP感知器作為對比,從結(jié)果中看出卷積神經(jīng)網(wǎng)絡(luò)效果更好。綜合以上幾點來看,本文的研究具有現(xiàn)實可應(yīng)用性,具有可推廣性,因而具有較高的實用價值!
到此這篇關(guān)于Python MNIST手寫體識別詳解與試練的文章就介紹到這了,更多相關(guān)Python 手寫體識別內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。