Tensorflow2.0學習(二)— Keras基礎應用(MNIST手寫數字圖像識別)

上一次第一節的內容是採用基本的神經網絡,多層感知機MLP進行手寫數據集訓練的,這次準備搭建卷積神經網絡對MNIST手寫數據集進行特徵提取,之後在送到MLP中進行訓練,關於之前提到的內容這邊就不再敘述,如果有對這節部分代碼內容有疑問的朋友們可以查看下我博客裏第一節的內容。

一.MNIST的數據預處理

1.這裏數據的導入部分和之前的一樣,唯一不同的是數據集的reshape部分。因爲這次使用的是卷積神經網絡來提取特徵進行識別(卷積神經網絡部分可參考網上其它博客,有很多教程),卷積網絡因爲必須先進行卷積與池化運算,所以必須保持圖像的維數。

2.導入相關第三方庫

import tensorflow as tf
from tensorflow.keras import layers
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

3.讀取MNIST的手寫數據

(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()

4.將圖像轉爲4維矩陣,使其滿足卷積神經網絡輸入要求,其中第一維爲batch_size,第二維第三維爲圖片大小,第四維爲圖片通道數,因爲這裏的圖像是單色灰度圖像,所以值爲1,如果是彩色圖像,則爲3。

#shape[0]代表的就是batch_size
x_train4D = x_train.reshape(x_train.shape[0],28,28,1).astype('float32')
x_test4D = x_test.reshape(x_test.shape[0],28,28,1).astype('float32')

5.對圖像進行進行標準化,使取值範圍在[0,1]之間。

x_train4D_normalize = x_train4D/255
x_test4D_normalize = x_test4D/255

6.對圖像標籤進行One-Hot編碼(獨熱編碼)。

y_trainOneHot = tf.keras.utils.to_categorical(y_train)
y_testOneHot = tf.keras.utils.to_categorical(y_test)

二.模型的搭建

1.建立Sequential線性堆疊模型。

#建立線性堆疊模型
model = tf.keras.models.Sequential()

2.模型結構:2層卷積層(提取特徵)+2層最大池化層(減小圖片大小)+1層Dropout層(防止過擬合)+1層平坦層(將提取的所有特徵轉爲一維向量)+ 兩層全連接層。

這裏蠻提一下池化的作用:/ 減少需要處理的圖像數據點,減少運算時間  / 減少圖片之間位置的差異 / 參數量減少有益於控制過擬合。

Dropout層主要爲了防止過擬合,具體內容上一節有提到。

而平坦層Flatten則是將卷積池化後的所有特徵轉化爲一維向量,以便於神經網絡可以輸入。

#filter等於是濾鏡,對原圖像提取生成16個的特徵圖像,比如有的濾鏡是提取邊緣,有的提取的是別的特徵。kernel_size則是卷積核大小,padding='same'的意思是,卷積層的輸出大小與原圖像大小一樣,用0值補全。
model.add(layers.Conv2D(filters=16,kernel_size=(5,5),padding='same',input_shape=(28,28,1),activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2,2))) #最大池化,此時圖像大小爲14x14
model.add(layers.Conv2D(filters=32,kernel_size=(5,5),padding='same',activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2,2))) #此時圖像大小爲7x7
model.add(layers.Dropout(0.3)) #使百分30的神經元失活
model.add(layers.Flatten()) #轉一維向量輸入
model.add(layers.Dense(128,activation='relu'))
model.add(layers.Dropout(0.5)) #使百分50神經元失活
model.add(layers.Dense(10,activation='softmax'))

3.模型概要查看

print(model.summary())

三.模型的訓練

1.相關參數設置及訓練,具體參數意義可參照上節內容。

model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
train_history = model.fit(x=x_train4D_normalize,y=y_trainOneHot,validation_split=0.2,epochs=5,batch_size=300,verbose=2)

2.查看參數保存內容。

print(train_history.history)

3.調用上節編寫的show_train_history函數查看曲線變化。

show_train_history(train_history,'accuracy','val_accuracy')

四.模型的預測

1.用測試集進行預測。

scores = model.evaluate(x_test4D_normalize,y_testOneHot)
print(scores[1])
prediction = model.predict_classes(x_test4D_normalize)
print(prediction[:10]) #顯示前10個數字預測結果

2.調用pandas的混淆矩陣查看結果。

pd.crosstab(y_test,prediction,rownames=['label'],colnames=['predict'])

 

以上是這一節的筆記和內容,下節會對更難一點的CIFAR-10的10類彩色圖像進行識別分類。謝謝大家的觀看支持。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章