首頁 > 軟體

Tensorflow2.1 MNIST影象分類實現思路分析

2022-11-21 14:01:31

前言

之前工作中主要使用的是 Tensorflow 1.15 版本,但是漸漸跟不上工作中的專案需求了,而且因為 2.x 版本和 1.x 版本差異較大,所以要專門花時間學習一下 2.x 版本,本文作為學習 Tensorflow 2.x 版本的開篇,主要介紹了使用 cpu 版本的 Tensorflow 2.1 搭建深度學習模型,完成對於 MNIST 資料的圖片分類的任務。

主要思路和實現

(1) 載入資料,處理資料

這裡是要匯入 tensorflow 的包,前提是你要提前安裝 tensorflow ,我這裡為了方便直接使用的是 cpu 版本的 tensorflow==2.1.0 ,如果是為了學習的話,cpu 版本的也夠用了,畢竟資料量和模型都不大。

import tensorflow as tf

這裡是為了載入 mnist 資料集,mnist 資料集裡面就是 0-9 這 10 個數位的圖片集,我們要使用深度學習實現一個模型完成對 mnist 資料集進行分類的任務,這個專案相當於 java 中 hello world 。

mnist = tf.keras.datasets.mnist

這裡的 (x_train, y_train) 表示的是訓練集的圖片和標籤,(x_test, y_test) 表示的是測試集的圖片和標籤。

(x_train, y_train), (x_test, y_test) = mnist.load_data()

每張圖片是 28*28 個畫素點(數位)組成的,而每個畫素點(數位)都是 0-255 中的某個數位,我們對其都除 255 ,這樣就是相當於對這些圖片的畫素點值做歸一化,這樣有利於模型加速收斂,在本專案中執行本操作比不執行本操作最後的準確率高很多,在文末會展示註釋本行情況下,模型評估的指標結果,大家可以自行對比差異。

x_train, x_test = x_train / 255.0, x_test / 255.0

(2) 使用 keras 搭建深度學習模型

這裡主要是要構建機器學習模型,模型分為以下幾層:

  • 第一層要接收圖片的輸入,每張圖片是 28*28 個畫素點組成的,所以 input_shape=(28, 28)
  • 第二層是一個輸出 128 維度的全連線操作
  • 第三層是要對第二層的輸出隨機丟棄 20% 的 Dropout 操作,這樣有利於模型的泛化

第四層是一個輸出 10 維度的全連線操作,也就是預測該圖片分別屬於這十種型別的概率

 model = tf.keras.models.Sequential([
   tf.keras.layers.Flatten(input_shape=(28, 28)),
   tf.keras.layers.Dense(128, activation='relu'),
   tf.keras.layers.Dropout(0.2),
   tf.keras.layers.Dense(10)
 ])

(3) 定義損失函數

這裡主要是定義損失函數,這裡的損失函數使用到了 SparseCategoricalCrossentropy ,主要是為了計算標籤和預測結果之間的交叉熵損失。

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

(4) 設定編譯模型

這裡主要是設定和編譯模型,優化器使用了 adam ,要優化的評價指標選用了準確率 accuracy ,當然了還可以選擇其他的優化器和評價指標。

model.compile(optimizer='adam', loss=loss_fn, metrics=['accuracy'])

(5) 使用訓練資料訓練模型

這裡主要使用訓練資料的圖片和標籤來訓練模型,將整個訓練樣本集訓練 5 次。

model.fit(x_train, y_train, epochs=5) 

訓練過程結果輸出如下:

Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 3s 43us/sample - loss: 0.2949 - accuracy: 0.9144
Epoch 2/5
60000/60000 [==============================] - 2s 40us/sample - loss: 0.1434 - accuracy: 0.9574
Epoch 3/5
60000/60000 [==============================] - 2s 36us/sample - loss: 0.1060 - accuracy: 0.9676
Epoch 4/5
60000/60000 [==============================] - 2s 31us/sample - loss: 0.0891 - accuracy: 0.9721
Epoch 5/5
60000/60000 [==============================] - 2s 29us/sample - loss: 0.0740 - accuracy: 0.9771
10000/10000 - 0s - loss: 0.0744 - accuracy: 0.9777

(6) 使用測試資料評估模型

這裡主要是使用測試資料中的圖片和標籤來評估模型,verbose 可以選為 0、1、2 ,區別主要是結果輸出的形式不一樣,嫌麻煩可以不設定

model.evaluate(x_test,  y_test, verbose=2)

評估的損失值和準確率如下:

[0.07444974237508141, 0.9777]

(7) 展示不使用歸一化的操作的訓練和評估結果

在不使用歸一化操作的情況下,訓練過程輸出如下:

Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 3s 42us/sample - loss: 2.4383 - accuracy: 0.7449
Epoch 2/5
60000/60000 [==============================] - 2s 40us/sample - loss: 0.5852 - accuracy: 0.8432
Epoch 3/5
60000/60000 [==============================] - 2s 36us/sample - loss: 0.4770 - accuracy: 0.8724
Epoch 4/5
60000/60000 [==============================] - 2s 34us/sample - loss: 0.4069 - accuracy: 0.8950
Epoch 5/5
60000/60000 [==============================] - 2s 32us/sample - loss: 0.3897 - accuracy: 0.8996
10000/10000 - 0s - loss: 0.2898 - accuracy: 0.9285

評估結果輸入如下:

[0.2897613683119416, 0.9285]

所以我們通過和上面的進行對比發現,不進行歸一化操作,在訓練過程中收斂較慢,在相同 epoch 的訓練之後,評估的準確率和損失值都不理想,損失值比第(6)步操作的損失值大,準確率比第(6)步操作低 5% 左右。

以上就是Tensorflow2.1 MNIST影象分類實現思路分析的詳細內容,更多關於Tensorflow2.1 MNIST影象分類的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com