Tensorflow2.1 MNIST圖像分類實(shí)現(xiàn)思路分析
前言
之前工作中主要使用的是 Tensorflow 1.15 版本,但是漸漸跟不上工作中的項(xiàng)目需求了,而且因?yàn)?2.x 版本和 1.x 版本差異較大,所以要專門花時(shí)間學(xué)習(xí)一下 2.x 版本,本文作為學(xué)習(xí) Tensorflow 2.x 版本的開(kāi)篇,主要介紹了使用 cpu 版本的 Tensorflow 2.1 搭建深度學(xué)習(xí)模型,完成對(duì)于 MNIST 數(shù)據(jù)的圖片分類的任務(wù)。
主要思路和實(shí)現(xiàn)
(1) 加載數(shù)據(jù),處理數(shù)據(jù)
這里是要導(dǎo)入 tensorflow 的包,前提是你要提前安裝 tensorflow ,我這里為了方便直接使用的是 cpu 版本的 tensorflow==2.1.0 ,如果是為了學(xué)習(xí)的話,cpu 版本的也夠用了,畢竟數(shù)據(jù)量和模型都不大。
import tensorflow as tf
這里是為了加載 mnist 數(shù)據(jù)集,mnist 數(shù)據(jù)集里面就是 0-9 這 10 個(gè)數(shù)字的圖片集,我們要使用深度學(xué)習(xí)實(shí)現(xiàn)一個(gè)模型完成對(duì) mnist 數(shù)據(jù)集進(jìn)行分類的任務(wù),這個(gè)項(xiàng)目相當(dāng)于 java 中 hello world 。
mnist = tf.keras.datasets.mnist
這里的 (x_train, y_train) 表示的是訓(xùn)練集的圖片和標(biāo)簽,(x_test, y_test) 表示的是測(cè)試集的圖片和標(biāo)簽。
(x_train, y_train), (x_test, y_test) = mnist.load_data()
每張圖片是 28*28 個(gè)像素點(diǎn)(數(shù)字)組成的,而每個(gè)像素點(diǎn)(數(shù)字)都是 0-255 中的某個(gè)數(shù)字,我們對(duì)其都除 255 ,這樣就是相當(dāng)于對(duì)這些圖片的像素點(diǎn)值做歸一化,這樣有利于模型加速收斂,在本項(xiàng)目中執(zhí)行本操作比不執(zhí)行本操作最后的準(zhǔn)確率高很多,在文末會(huì)展示注釋本行情況下,模型評(píng)估的指標(biāo)結(jié)果,大家可以自行對(duì)比差異。
x_train, x_test = x_train / 255.0, x_test / 255.0
(2) 使用 keras 搭建深度學(xué)習(xí)模型
這里主要是要構(gòu)建機(jī)器學(xué)習(xí)模型,模型分為以下幾層:
- 第一層要接收?qǐng)D片的輸入,每張圖片是 28*28 個(gè)像素點(diǎn)組成的,所以 input_shape=(28, 28)
- 第二層是一個(gè)輸出 128 維度的全連接操作
- 第三層是要對(duì)第二層的輸出隨機(jī)丟棄 20% 的 Dropout 操作,這樣有利于模型的泛化
第四層是一個(gè)輸出 10 維度的全連接操作,也就是預(yù)測(cè)該圖片分別屬于這十種類型的概率
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) 定義損失函數(shù)
這里主要是定義損失函數(shù),這里的損失函數(shù)使用到了 SparseCategoricalCrossentropy ,主要是為了計(jì)算標(biāo)簽和預(yù)測(cè)結(jié)果之間的交叉熵?fù)p失。
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
(4) 配置編譯模型
這里主要是配置和編譯模型,優(yōu)化器使用了 adam ,要優(yōu)化的評(píng)價(jià)指標(biāo)選用了準(zhǔn)確率 accuracy ,當(dāng)然了還可以選擇其他的優(yōu)化器和評(píng)價(jià)指標(biāo)。
model.compile(optimizer='adam', loss=loss_fn, metrics=['accuracy'])
(5) 使用訓(xùn)練數(shù)據(jù)訓(xùn)練模型
這里主要使用訓(xùn)練數(shù)據(jù)的圖片和標(biāo)簽來(lái)訓(xùn)練模型,將整個(gè)訓(xùn)練樣本集訓(xùn)練 5 次。
model.fit(x_train, y_train, epochs=5)
訓(xùn)練過(guò)程結(jié)果輸出如下:
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) 使用測(cè)試數(shù)據(jù)評(píng)估模型
這里主要是使用測(cè)試數(shù)據(jù)中的圖片和標(biāo)簽來(lái)評(píng)估模型,verbose 可以選為 0、1、2 ,區(qū)別主要是結(jié)果輸出的形式不一樣,嫌麻煩可以不設(shè)置
model.evaluate(x_test, y_test, verbose=2)
評(píng)估的損失值和準(zhǔn)確率如下:
[0.07444974237508141, 0.9777]
(7) 展示不使用歸一化的操作的訓(xùn)練和評(píng)估結(jié)果
在不使用歸一化操作的情況下,訓(xùn)練過(guò)程輸出如下:
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
評(píng)估結(jié)果輸入如下:
[0.2897613683119416, 0.9285]
所以我們通過(guò)和上面的進(jìn)行對(duì)比發(fā)現(xiàn),不進(jìn)行歸一化操作,在訓(xùn)練過(guò)程中收斂較慢,在相同 epoch 的訓(xùn)練之后,評(píng)估的準(zhǔn)確率和損失值都不理想,損失值比第(6)步操作的損失值大,準(zhǔn)確率比第(6)步操作低 5% 左右。
以上就是Tensorflow2.1 MNIST圖像分類實(shí)現(xiàn)思路分析的詳細(xì)內(nèi)容,更多關(guān)于Tensorflow2.1 MNIST圖像分類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集實(shí)現(xiàn)示例
- TensorFlow神經(jīng)網(wǎng)絡(luò)創(chuàng)建多層感知機(jī)MNIST數(shù)據(jù)集
- TensorFlow教程Softmax邏輯回歸識(shí)別手寫(xiě)數(shù)字MNIST數(shù)據(jù)集
- Tensorflow2.1實(shí)現(xiàn)文本中情感分類實(shí)現(xiàn)解析
- Tensorflow?2.1完成對(duì)MPG回歸預(yù)測(cè)詳解
- Tensorflow?2.4加載處理圖片的三種方式詳解
相關(guān)文章
python自動(dòng)化神器pyautogui使用步驟
這篇文章主要給大家介紹了關(guān)于python自動(dòng)化神器pyautogui使用步驟的相關(guān)資料,在Python當(dāng)中不僅代碼簡(jiǎn)單,而且有著非常豐富的模塊,pyautogui就可以稱之為自動(dòng)化操作的"神器",需要的朋友可以參考下2023-07-07
如何在django里上傳csv文件并進(jìn)行入庫(kù)處理的方法
這篇文章主要介紹了如何在django里上傳csv文件并進(jìn)行入庫(kù)處理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
基于python實(shí)現(xiàn)動(dòng)態(tài)煙霧效果
動(dòng)態(tài)煙霧效果常用于游戲和動(dòng)畫(huà)中,為場(chǎng)景增添 逼真的視覺(jué)效果,在這篇博客中,我們將使用Python和Pygame庫(kù)來(lái)創(chuàng)建一個(gè)逼真的煙霧動(dòng)畫(huà)效果,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-09-09
對(duì)python 匹配字符串開(kāi)頭和結(jié)尾的方法詳解
今天小編就為大家分享一篇對(duì)python 匹配字符串開(kāi)頭和結(jié)尾的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Python cx_freeze打包工具處理問(wèn)題思路及解決辦法
這篇文章主要介紹了Python cx_freeze打包工具處理問(wèn)題思路及解決辦法的相關(guān)資料,需要的朋友可以參考下2016-02-02
PythonWeb項(xiàng)目Django部署在Ubuntu18.04騰訊云主機(jī)上
這篇文章主要介紹了PythonWeb項(xiàng)目Django部署在Ubuntu18.04騰訊云主機(jī)上的相關(guān)知識(shí),本文通過(guò)代碼加文字說(shuō)明的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04
Python高級(jí)編程之繼承問(wèn)題詳解(super與mro)
這篇文章主要介紹了Python高級(jí)編程之繼承問(wèn)題,結(jié)合實(shí)例形式詳細(xì)分析了Python多繼承、MRO順序及super調(diào)用父類等相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
Python測(cè)試函數(shù)出現(xiàn)AssertionError:None?!=?‘Janis?Joplin‘問(wèn)題及解決
這篇文章主要介紹了Python測(cè)試函數(shù)出現(xiàn)AssertionError:None?!=?‘Janis?Joplin‘問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09

