基于MNIST實(shí)現(xiàn)字符識(shí)別

說(shuō)明

  1. 這是一個(gè)關(guān)于TensorFlow的基礎(chǔ)教程
  2. 本任務(wù)主要是基于TensorFlow實(shí)現(xiàn)對(duì)于MNIST數(shù)據(jù)集的處理
  3. 通過(guò)本任務(wù),希望大家能夠了解TensorFlow構(gòu)建神經(jīng)網(wǎng)絡(luò)的大致過(guò)程
  4. MNIST數(shù)據(jù)集展示
    mnist數(shù)據(jù)集

訓(xùn)練過(guò)程

  1. 導(dǎo)入相關(guān)包以及載入數(shù)據(jù)
    導(dǎo)入數(shù)據(jù)
  2. 查看樣本數(shù)據(jù)
    數(shù)據(jù)查驗(yàn)
  3. 查看多個(gè)數(shù)據(jù)
    多樣本查驗(yàn)
  4. 數(shù)據(jù)歸一化(深度學(xué)習(xí)模型處理 0 至 1 之間的數(shù)字時(shí)更加得心應(yīng)手(后面會(huì)有詳細(xì)介紹),所以我們會(huì)取全部像素值,并用每個(gè)值除以 255。我們將此過(guò)程稱為歸一化。)
    特征歸一化
  5. 標(biāo)簽序列化(將標(biāo)量轉(zhuǎn)換成向量):
    標(biāo)簽序列化
  6. 搭建模型
    搭建模型
  7. 模型編譯
    模型編譯
  8. 模型訓(xùn)練
    模型訓(xùn)練

完整代碼

# ===========導(dǎo)入數(shù)據(jù)集==========
from tensorflow.keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# ==========查看數(shù)據(jù)=========
import matplotlib.pyplot as plt
image = x_train[0]
label = y_train[0]
plt.imshow(image, cmap="gray")
plt.title(label, fontdict={'fontsize': 30})

# ==========數(shù)據(jù)預(yù)處理(歸一化)==========
## 以下兩種方式等價(jià)(第一個(gè)是具體公式,第二個(gè)是簡(jiǎn)便寫法)
x_train = (x_train - x_train.min()) / (x_train.max() - x_train.min())
x_test = x_test / 255

# ==========對(duì)標(biāo)簽進(jìn)行多分類編碼(變量轉(zhuǎn)向量)==========
import tensorflow.keras as keras
print("format y_train[0] is ", y_train[0])
num_categories = 10   # 0~9一共有10個(gè)數(shù)字
# 將標(biāo)量轉(zhuǎn)換成向量
y_train = keras.utils.to_categorical(y_train, num_categories)
y_test = keras.utils.to_categorical(y_test, num_categories)
print("after encoding, y_train[0] is ", y_train[0])

# ===============創(chuàng)建模型==================
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
# 輸入層
"""
units參數(shù)指定該層中神經(jīng)元的數(shù)量。 這里使用512,這是一個(gè)很好的起始值。也可以稍后修改此值來(lái)查看它如何影響訓(xùn)練結(jié)果。
activation:激活函數(shù),這里將使用relu激勵(lì)函數(shù),它將幫助我們的網(wǎng)絡(luò)做出比使用線性激勵(lì)函數(shù)更為復(fù)雜的預(yù)測(cè)
input_shape值指定輸入數(shù)據(jù)的形狀/維度。
"""
model.add(Dense(units=512, activation='relu', input_shape=(784,)))  # 輸入變量有784維
# 隱藏層
model.add(Dense(units = 512, activation='relu'))
# 輸出層
"""
該層使用softmax激勵(lì)函數(shù),該函數(shù)將使該層的每個(gè)輸出值是0到1之間的概率值,并且該層的所有輸出相加等于1。
在這種情況下,由于網(wǎng)絡(luò)要對(duì)一個(gè)圖像屬于0到9中的一個(gè)進(jìn)行預(yù)測(cè),所以一共有10個(gè)輸出,每個(gè)輸出都會(huì)給出模型對(duì)圖像屬于某個(gè)類的猜測(cè)值(概率)
因此,softmax較適用于需要分類的應(yīng)用場(chǎng)景。
"""
model.add(Dense(units = 10, activation='softmax'))     # 輸出有10個(gè)類別,激活函數(shù)使用softmax
# 模型總結(jié)
model.summary()

# ==========模型編譯==========
"""
在實(shí)際使用數(shù)據(jù)訓(xùn)練模型之前,我們需要做的最后一步是對(duì)模型進(jìn)行編譯。
在這里,我們要指定一個(gè)損失函數(shù),模型將用該函數(shù)來(lái)了解其在訓(xùn)練過(guò)程中的表現(xiàn)。我們還要指定在模型訓(xùn)練時(shí)我們將要跟蹤準(zhǔn)確率
"""
model.compile(loss='categorical_crossentropy', metrics=['accuracy'])

# ==========訓(xùn)練模型==========
"""
x_train, y_train:分別是訓(xùn)練數(shù)據(jù)和訓(xùn)練標(biāo)簽;
epochs:表示在整個(gè)訓(xùn)練數(shù)據(jù)集上進(jìn)行訓(xùn)練的次數(shù);
verbose=1:顯示訓(xùn)練過(guò)程和日志信息
validation_data:校驗(yàn)數(shù)據(jù),每一個(gè)訓(xùn)練完模型都會(huì)使用校驗(yàn)數(shù)據(jù)進(jìn)行檢查
"""
model.fit(x_train, y_train, 
          epochs=5,
          verbose=1,
          validation_data=(x_test, y_test)
         )

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容