日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Tensorflow2.1?MNIST圖像分類實現思路分析_python

作者:我是王大你是誰 ? 更新時間: 2022-12-15 編程語言

前言

之前工作中主要使用的是 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% 左右。

原文鏈接:https://juejin.cn/post/7164678763903451172

欄目分類
最近更新