日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2.利用tensorflow框架对服装进行分类

發布時間:2023/12/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.利用tensorflow框架对服装进行分类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TensorFlow程序概述

本篇博文來自網址https://www.tensorflow.org/tutorials/keras/text_classification?hl=zh_cn 我對其代碼進行復現,這里需要注意的是訪問該網站需要ladder。本文使用了tf.keras,它是TensorFlow中用來構建和訓練模型的高級API。

#TensorFlow and tf.keras import tensorflow as tf from tensorflow import keras#Helper Libraries import numpy as np import matplotlib.pyplot as pltprint(tf.__version__) 2.8.0

導入Fashion MNIST數據集

本篇博客使用的是Fashion MNIST數據集,該數據集包含10個類別的70000個灰度圖像。這些圖像以低分辨率(28×28)展示了單件物品。MNIST數據集包含了手寫數字(0,1,2等)的圖像,其格式與我們用的衣物圖像的格式相同。我們使用60000個圖像來訓練網絡,使用10000個圖像來評估網絡學習對圖像分類的準確性。加載數據集的代碼如下:

fashion_mnist = keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

加載數據會返回四個Numpy數組:
·train_image和train_labels數組是訓練集,即模型用于學習數據。
·測試集、test_image和test_labels數組會被用來對模型進行測試。圖像是28×28的Numpy數組,像素介于0到255之間。標簽是整數數組,介于0到9之間。這些標簽對應于圖像所代表的服裝類別。
每個圖像都會被映射到一個標簽。由于數據集不包括類名稱,將它們儲存在下方,供稍后繪制圖像時使用:

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress','Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag','Ankle boot'] #class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', # 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

瀏覽數據

在訓練模型之前,我們先瀏覽一下數據集的格式。以下代碼顯示訓練集中有60000個圖像,每個圖像由28×28的像素表示。

train_images.shape (60000, 28, 28) len(train_labels) 60000

訓練集中有60000個標簽。

train_labels array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)

每個標簽都是0到9之間的整數

test_images.shape (10000, 28, 28)

測試集中有10000個圖像。同樣,每個圖像都有28×28個像素表示

len(test_labels) 10000

測試集中包含10000個圖像標簽

預處理數據

在訓練網絡之前,必須對數據進行預處理。如果檢查訓練集中的第一個圖像,會看到像素值位于0到255之間。

plt.figure() plt.imshow(train_images[0]) plt.colorbar() plt.grid(False) plt.show()

將這些值縮到0到1之間,然后將其饋送到神經網絡模型中。為此要將這些值除以255。這里我們務必以相同的方式對訓練集和測試集進行預處理。

train_images = train_images / 255.0 test_images = test_images / 255.0

為了驗證數據的格式是否正確,以及我們是否準備好構建和訓練網絡,我們展示訓練集中的前25個圖像,并在每個圖像下方顯示類名稱。

plt.figure(figsize=(10,10)) for i in range(25):plt.subplot(5,5,i+1)plt.xticks([])plt.yticks([])plt.grid(False)plt.imshow(train_images[i], cmap=plt.cm.binary)plt.xlabel(class_names[train_labels[i]]) plt.show()

構建模型

構建神經網絡模型需要先配置模型的層,然后編譯模型。

設置層

神經網絡的基本組成部分是層。層會從向其饋送的數據中提取表示形式。大多數深層學習都包括將簡單的層鏈接在一起。大多數層(tf.keras.layers.Dense)都具有在訓練期間才會學習參數。

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

該網絡的第一層tf.keras.layers.Flatten將圖像格式從二維數組(28×28像素)轉換成一維數組(28×28=784像素)。將該層視為圖像中未堆疊的像素行并將其排列起來。該層沒有要學習的參數,它會重新格式化數據。
展開像素后,網絡會包括兩個tf.keras.layers.Flatten層的序列。它們是密集連接或全連接神經網絡。第一個Dense層128個節點(或者神經元)。第二個(也是最后一個)層會返回一個長度為10的lofits數組。每個節點都包含一個得分,用來表示當前圖像屬于10個類中的哪一類。

編譯模型

在準備對模型進行訓練之前,還需要再對其進行一些設置。以下內容是在模型的編譯步驟中進行的:

1.損失函數:用來測量模型在訓練期間的準確率。我們會希望最小化此函數,以便將模型“引導”到正確的方向上。

2.優化器:決定模型如何根據其看到的數據和自身的損失函數進行更新。

3.指標:用于監測訓練和測試步驟。以下示例使用了準確率,即被正確分類的圖像的比率。

model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])

訓練模型

訓練神經網絡模型需要執行以下步驟:

1.將訓練數據饋送給模型。在本個小項目中,訓練數據位于train_imagestrain_labels數組中。

2.模型學習將圖像和標簽關聯起來

3.要求模型對測試集(在本例中為test_images數組)進行預測

4.驗證預測是否與test_labels數組中的標簽相匹配。

向模型饋送數據

要開始訓練,需要調用model.fit,這樣命名是因為該方法會將模型與訓練數據進行“擬合”:

model.fit(train_images, train_labels, epochs=10) Epoch 1/10 1875/1875 [==============================] - 9s 3ms/step - loss: 0.4948 - accuracy: 0.8263 Epoch 2/10 1875/1875 [==============================] - 6s 3ms/step - loss: 0.3724 - accuracy: 0.8666 Epoch 3/10 1875/1875 [==============================] - 6s 3ms/step - loss: 0.3360 - accuracy: 0.8776 Epoch 4/10 1875/1875 [==============================] - 6s 3ms/step - loss: 0.3118 - accuracy: 0.8856 Epoch 5/10 1875/1875 [==============================] - 6s 3ms/step - loss: 0.2935 - accuracy: 0.8912 Epoch 6/10 1875/1875 [==============================] - 6s 3ms/step - loss: 0.2810 - accuracy: 0.8959 Epoch 7/10 1875/1875 [==============================] - 6s 3ms/step - loss: 0.2691 - accuracy: 0.8999 Epoch 8/10 1875/1875 [==============================] - 6s 3ms/step - loss: 0.2589 - accuracy: 0.9037 Epoch 9/10 1875/1875 [==============================] - 6s 3ms/step - loss: 0.2504 - accuracy: 0.9058 Epoch 10/10 1875/1875 [==============================] - 6s 3ms/step - loss: 0.2402 - accuracy: 0.9098<keras.callbacks.History at 0x19925177820>

在模型訓練期間(聽到了“燃燒CPU的聲音了”),會顯示損失和準確率指標。此模型在訓練數據上的準確率達到了0.91(91%)左右、

評估準確率

接下來,比較模型在測試數據集上的表現:

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)print('\nTest accuracy:', test_acc) 313/313 - 1s - loss: 0.3376 - accuracy: 0.8815 - 807ms/epoch - 3ms/stepTest accuracy: 0.8815000057220459

結果表明,模型在測試數據集上的準確率略低于訓練數據集。訓練準確率和測試準確率之間的差距代表過擬合,過擬合是指機器學習模型在新的、以前曾經出現過的輸入上的表現不如在訓練數據上的表現。過擬合的模型會記住訓練數據集中的噪聲和細節,從而對模型在新數據上變現產生負面影響。這里我還會將整理<演示過擬合>,<避免過擬合的策略>

進行預測

在模型經過訓練后,可以使用它對一些圖像進行預測.模型具有線性輸出,即logits.我們可以附加一個softmax層,將logits轉換成更容易理解的概率.

probability_model = tf.keras.Sequential([model,tf.keras.layers.Softmax()]) predictions = probability_model.predict(test_images) predictions[0] array([9.8330077e-07, 2.0626763e-08, 8.2670876e-10, 2.9593509e-12,1.2751320e-07, 3.7031923e-04, 3.7946873e-07, 1.1762976e-02,1.1164550e-08, 9.8786515e-01], dtype=float32)

預測結果是一個包含10個數字的數組.他們代表模型對10中不同服裝中每一種服裝的置信度,我們取值為最大值:

np.argmax(predictions[0]) 9

因此,該模型非常確信這個圖像是短靴,或者class_names[9].通過檢查測試標簽發現這個分類是正確的:

test_labels[0] 9

我們可以將其繪制成圖表,看看模型對于全部10個類的預測

def plot_image(i, predictions_array, true_label, img):prediction_array, true_label, img = predictions_array, true_label[i], img[i]plt.grid(False)plt.xticks([])plt.yticks([])plt.imshow(img, cmap=plt.cm.binary)predicted_label = np.argmax(predictions_array)if predicted_label == true_label:color = 'blue'else:color = 'red'plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],100*np.max(predictions_array),class_names[true_label]),color=color)def plot_value_array(i, predictions_array, true_label):predictions_array, true_label = predictions_array, true_label[i]plt.grid(False)plt.xticks(range(10))plt.yticks([])thisplot = plt.bar(range(10), predictions_array, color="#777777")plt.ylim([0,1])predicted_label = np.argmax(predictions_array)thisplot[predicted_label].set_color('red')thisplot[true_label].set_color('blue')

驗證預測結果

在模型經過訓練后,可以使用它對一些圖像進行預測.
我們來看看第0個圖像,預測結果和預測數組.正確的預測標簽為藍色,錯誤的預測標簽為紅色,數字表示預測標簽的百分比(總計為100)

i = 0 plt.figure(figsize=(6,3)) plt.subplot(1,2,1) plot_image(i, predictions[i], test_labels, test_images) plt.subplot(1,2,2) plot_value_array(i, predictions[i], test_labels) plt.show()

i = 12 plt.figure(figsize=(6,3)) plt.subplot(1,2,1) plot_image(i, predictions[i], test_labels, test_images) plt.subplot(1,2,2) plot_value_array(i, predictions[i], test_labels) plt.show()

讓我們用模型的預測繪制幾張圖像,即使置信度很高,模型也會出錯.

# 繪制一些測試圖像(預測標簽和真實標簽) #將正確預測用藍色表示,錯誤的預測用紅色表示 num_rows = 5 num_cols = 3 num_images = num_rows*num_cols plt.figure(figsize=(2*2*num_cols, 2*num_rows)) for i in range(num_images):plt.subplot(num_rows, 2*num_cols, 2*i+1)plot_image(i, predictions[i], test_labels, test_images)plt.subplot(num_rows, 2*num_cols, 2*i+2)plot_value_array(i, predictions[i], test_labels) plt.tight_layout() plt.show()

使用訓練好的模型

最后,使用訓練好的模型對單個圖像進行預測

#從測試集中加載圖片 img = test_images[1]print(img.shape) (28, 28)

tf.keras模型經過優化,可同時對一個或一組樣本進行預測.因此,即便我們只使用一個圖像,我們也需要將其添加到列表中.

# 添加圖像到只有一個單元的batch中 img = (np.expand_dims(img, 0))print(img.shape) (1, 28, 28)

現在預測這個圖像的正確標簽:

predictions_single = probability_model.predict(img) print(predictions_single) [[2.8947479e-06 1.5108573e-15 9.9898154e-01 1.1753938e-12 9.6314441e-044.2196581e-15 5.2470656e-05 1.1998774e-24 2.6323577e-11 1.7504824e-13]] plot_value_array(1, predictions_single[0], test_labels) plt.xticks(range(10), class_names, rotation=45) ([<matplotlib.axis.XTick at 0x19a1efd1fa0>,<matplotlib.axis.XTick at 0x19a1efd1f70>,<matplotlib.axis.XTick at 0x19a1efd16a0>,<matplotlib.axis.XTick at 0x19a1efffb80>,<matplotlib.axis.XTick at 0x19a1efffe50>,<matplotlib.axis.XTick at 0x19a1f007550>,<matplotlib.axis.XTick at 0x19a1f007ca0>,<matplotlib.axis.XTick at 0x19a1f321220>,<matplotlib.axis.XTick at 0x19a1f3219a0>,<matplotlib.axis.XTick at 0x19a1f327130>],[Text(0, 0, 'T-shirt/top'),Text(1, 0, 'Trouser'),Text(2, 0, 'Pullover'),Text(3, 0, 'Dress'),Text(4, 0, 'Coat'),Text(5, 0, 'Sandal'),Text(6, 0, 'Shirt'),Text(7, 0, 'Sneaker'),Text(8, 0, 'Bag'),Text(9, 0, 'Ankle boot')])

keras.Model.predict會返回一組列表,每個列表對應一批數據中的每個圖像.在批次中獲取對我們(唯一)圖像的預測

np.argmax(predictions_single[0]) 2

模型會按照預期預測標簽.

總結

上述內容是講述進行一個基本分類項目的基本步驟,我們對細節不是很了解沒有關系,這里只是幫助我們拎起一個大的框架,讓我們知道在tensorflow框架下構建項目的簡潔性.后面我會繼續對該指南進行傻瓜式記錄,希望在復現別人項目的基礎上逐漸鞏固對機器學習的認識.

總結

以上是生活随笔為你收集整理的2.利用tensorflow框架对服装进行分类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。