Tensorflow2.1實(shí)現(xiàn)Fashion圖像分類示例詳解
實(shí)現(xiàn)思路和詳細(xì)解讀
1. 獲取 Fashion 數(shù)據(jù)、處理數(shù)據(jù)
(1)本次實(shí)踐項(xiàng)目用到的是 Fashion 數(shù)據(jù)集,包含 10 個(gè)類別的服飾灰度圖片,共 70000 張,每張圖片展示一件衣物,每張圖片都是低分辨率的 28x28 像素(其實(shí)就是28*28的整數(shù)矩陣)。部分效果如下:
本次實(shí)踐中我們對(duì)數(shù)據(jù)集進(jìn)行訓(xùn)練集和測(cè)試集的劃分,使用 60000 張圖片來訓(xùn)練模型,使用 10000 張圖片來評(píng)估模型對(duì)服飾圖片的分類的準(zhǔn)確程度。
直接通過 tensorflow 內(nèi)置的接口函數(shù)從網(wǎng)絡(luò)上下載數(shù)據(jù)集,其中 (train_images, train_labels) 分別是訓(xùn)練集中的圖片和標(biāo)簽,(test_images, test_labels) 分別是測(cè)試集中的圖片和標(biāo)簽。
fashion = tf.keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = fashion.load_data()
(2)這里主要是使用列表來保存數(shù)據(jù)集中出現(xiàn)過的所有衣服種類的名字。
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
(3)定義一個(gè)函數(shù),主要用來顯示某張照片。
def showImage(image): plt.figure() plt.imshow(image, cmap=plt.cm.binary) plt.colorbar() plt.grid(False) plt.show()
(4)這里主要展示訓(xùn)練集中第一張?jiān)紙D片的樣子,我們可以看到每張圖片都是低分辨率的 28x28 像素(其實(shí)就是28*28的矩陣數(shù)字),而且每個(gè)像素是在 0-255 之間的數(shù)字
showImage(train_images[0])
效果如下:
因?yàn)槊繌垐D片的每個(gè)像素都是 0-255 之間的整數(shù),所以我們?yōu)榱四P陀?xùn)練的加快收斂,將所有的圖片都進(jìn)行歸一化操作。
train_images = train_images / 255.0 test_images = test_images / 255.0
這里主要展示訓(xùn)練集中第一張?jiān)紙D片的樣子經(jīng)過歸一化操作的結(jié)果,可以看到每個(gè)像素點(diǎn)都是 0-1 之間的小數(shù)。
showImage(train_images[0])
效果如下:
2. 使用 tensorflow 2.1 搭建模型
(1)因?yàn)槊繌垐D片的輸入是 28*28 的像素點(diǎn),所以第一層的是輸入設(shè)置為 input_shape=(28, 28) ,輸出的是一個(gè) 784 維的向量,該操作可以看作是將 input_shape 多維數(shù)組中的值,重新拼接到一起整合成了一個(gè)一維數(shù)組。
(2)第二層、第三層都是通過激活函數(shù) relu 的非線性變化,輸出一個(gè) 64 維向量的全連接層操作,當(dāng)然這個(gè)網(wǎng)絡(luò)結(jié)構(gòu)的層數(shù)、激活函數(shù)、每層的輸出維度可以自行隨意調(diào)整,其大小會(huì)影響最后的模型評(píng)估的指標(biāo),理論上結(jié)構(gòu)越復(fù)雜效果越好,但是訓(xùn)練速度越慢,而且這也會(huì)引起過擬合的現(xiàn)象,這個(gè)度的把握需要不斷通過輸出的指標(biāo)來進(jìn)行調(diào)整。
(3)第三層是輸出一個(gè) 10 維度的全連接層操作,其實(shí)就是該輸入圖片分別屬于這十個(gè)類別的對(duì)應(yīng)的概率分布。
model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(10) ])
3. 配置并編譯模型
(1)這里我們選擇了 Adam 優(yōu)化器,這是一個(gè)比較成熟且廣泛使用的優(yōu)化器。
(2)這里的損失函數(shù)我們選擇了比較常見的交叉熵 SparseCategoricalCrossentropy 。
(3)這里我們選用了最為常用的模型評(píng)估指標(biāo)準(zhǔn)確率 accuracy。
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
4. 訓(xùn)練模型
(1)我們使用訓(xùn)練數(shù)據(jù)的圖片和標(biāo)簽來對(duì)模型進(jìn)行訓(xùn)練,并且設(shè)置 epochs 為 5 ,也就是將所有的訓(xùn)練集從頭到尾反復(fù)訓(xùn)練 5 次,如果模型還沒有收斂那你也可以把 epochs 的值設(shè)置的大一些,配合較為復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),最后模型在訓(xùn)練階段的準(zhǔn)確率應(yīng)該能達(dá)到 98% 以上。
(2)在模型的訓(xùn)練期間,命令行會(huì)顯示模型整體損失值和準(zhǔn)確率評(píng)估指標(biāo)的情況,這些都是 tensorflow 內(nèi)部函數(shù)寫好的輸出格式,你也可以自己寫代碼改變。
model.fit(train_images, train_labels, epochs=5)
訓(xùn)練過程輸出如下所示:
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 5s 78us/sample - loss: 0.5140 - accuracy: 0.8180
Epoch 2/5
60000/60000 [==============================] - 4s 73us/sample - loss: 0.3724 - accuracy: 0.8654
Epoch 3/5
60000/60000 [==============================] - 4s 74us/sample - loss: 0.3388 - accuracy: 0.8763
Epoch 4/5
60000/60000 [==============================] - 4s 70us/sample - loss: 0.3165 - accuracy: 0.8831
Epoch 5/5
60000/60000 [==============================] - 4s 74us/sample - loss: 0.2985 - accuracy: 0.8902
5. 評(píng)估模型
(1)這里我們使用測(cè)試數(shù)據(jù)來對(duì)模型進(jìn)行評(píng)估,評(píng)估的指標(biāo)也就是之前規(guī)定的準(zhǔn)確率。
(2)verbose=2 只是為了規(guī)定結(jié)果輸出形式,可以選擇 0、1、2 中的任意一個(gè) 。
loss, acc = model.evaluate(test_images, test_labels, verbose=2) print('Test accuracy:%f, Test loss:%f'%(acc, loss))
結(jié)果輸出如下所示,表明所訓(xùn)練的模型在測(cè)試集的評(píng)估下準(zhǔn)確率能達(dá)到 0.8725 :
10000/1 - 1s - loss: 0.2279 - accuracy: 0.8725 Test accuracy:0.872500, Test loss:0.352148
6. 使用模型進(jìn)行預(yù)測(cè)
(1)上面模型在預(yù)測(cè)每張圖片時(shí)最后輸出的都是一個(gè) 10 維的雜亂無章的浮點(diǎn)數(shù)數(shù)組,為了保證輸出的結(jié)果是被人容易理解的,我們?cè)谏厦婺P偷牡淖詈蠹由狭艘粚?Softmax 。
(2)Softmax 的功能很簡(jiǎn)單,就是將這 10 個(gè)雜亂無章的浮點(diǎn)數(shù),轉(zhuǎn)化成 10 個(gè)概率,每個(gè)概率值在 0-1 之間,這 10 個(gè)概率的和為 1 ,這樣我們?nèi)∑渲凶畲蟾怕实闹祵?duì)應(yīng)的衣服類別作為我們預(yù)測(cè)的結(jié)果。
model_by_softmax = tf.keras.Sequential([model, tf.keras.layers.Softmax()]) predictions = model_by_softmax.predict(test_images) predict_for_one_image = predictions[3] predict_for_one_image
輸出概率分布如下所示:
array([4.1939876e-07, 9.9996161e-01, 8.4085507e-08, 3.7719459e-05,
3.1557637e-08, 1.0500006e-13, 1.5945717e-07, 1.3569163e-13,
1.8028586e-09, 4.5183642e-11], dtype=float32)
(3)查看一張測(cè)試圖片在這 10 個(gè)衣服類別中的概率分布,我們發(fā)現(xiàn) 9.9996161e-01 最大,表明該圖片成為第二類衣服款式的概率最大。
(4)我們可以輸出預(yù)測(cè)的衣服種類,通過查找最大概率對(duì)應(yīng)的衣服種類,發(fā)現(xiàn)該圖片被預(yù)測(cè)的衣服類別是 Trouser 。
class_names[np.argmax(predict_for_one_image)]
輸出結(jié)果如下:
'Trouser'
(5)我們將原始圖片繪制出來發(fā)現(xiàn)確實(shí)是一條褲子,說明模型預(yù)測(cè)正確。
showImage(test_images[3])
展示效果如下:
以上就是Tensorflow2.1實(shí)現(xiàn)Fashion圖像分類示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Tensorflow Fashion圖像分類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 實(shí)現(xiàn)兩個(gè)服務(wù)器之間文件的上傳方法
今天小編就為大家分享一篇Python 實(shí)現(xiàn)兩個(gè)服務(wù)器之間文件的上傳方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python 數(shù)據(jù)化運(yùn)營之KMeans聚類分析總結(jié)
這篇文章主要介紹了Python 數(shù)據(jù)化運(yùn)營KMeans聚類相關(guān)的一些總結(jié),感興趣的話一起來閱讀下文吧2021-08-08使用ChatGPT來自動(dòng)化Python任務(wù)
這篇文章主要介紹了使用ChatGPT來自動(dòng)化Python任務(wù)的相關(guān)資料,需要的朋友可以參考下2022-12-12Python的批量遠(yuǎn)程管理和部署工具Fabric用法實(shí)例
這篇文章主要介紹了Python的批量遠(yuǎn)程管理和部署工具Fabric用法,實(shí)例分析了Fabric的功能與具體使用方法,需要的朋友可以參考下2015-01-01C# DataGridView行列轉(zhuǎn)換的具體實(shí)現(xiàn)
本文主要介紹了C# DataGridView行列轉(zhuǎn)換的具體實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python 使用 consul 做服務(wù)發(fā)現(xiàn)示例詳解
這篇文章主要介紹了Python 使用 consul 做服務(wù)發(fā)現(xiàn)示例詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03使用python實(shí)現(xiàn)離散時(shí)間傅里葉變換的方法
這篇文章主要介紹了使用python實(shí)現(xiàn)離散時(shí)間傅里葉變換的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09