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之間。這些標簽對應于圖像所代表的服裝類別。
每個圖像都會被映射到一個標簽。由于數據集不包括類名稱,將它們儲存在下方,供稍后繪制圖像時使用:
瀏覽數據
在訓練模型之前,我們先瀏覽一下數據集的格式。以下代碼顯示訓練集中有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個節(jié)點(或者神經元)。第二個(也是最后一個)層會返回一個長度為10的lofits數組。每個節(jié)點都包含一個得分,用來表示當前圖像屬于10個類中的哪一類。
編譯模型
在準備對模型進行訓練之前,還需要再對其進行一些設置。以下內容是在模型的編譯步驟中進行的:
1.損失函數:用來測量模型在訓練期間的準確率。我們會希望最小化此函數,以便將模型“引導”到正確的方向上。
2.優(yōu)化器:決定模型如何根據其看到的數據和自身的損失函數進行更新。
3.指標:用于監(jiān)測訓練和測試步驟。以下示例使用了準確率,即被正確分類的圖像的比率。
model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])訓練模型
訓練神經網絡模型需要執(zhí)行以下步驟:
1.將訓練數據饋送給模型。在本個小項目中,訓練數據位于train_images和train_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結果表明,模型在測試數據集上的準確率略低于訓練數據集。訓練準確率和測試準確率之間的差距代表過擬合,過擬合是指機器學習模型在新的、以前曾經出現過的輸入上的表現不如在訓練數據上的表現。過擬合的模型會記住訓練數據集中的噪聲和細節(jié),從而對模型在新數據上變現產生負面影響。這里我還會將整理<演示過擬合>,<避免過擬合的策略>
進行預測
在模型經過訓練后,可以使用它對一些圖像進行預測.模型具有線性輸出,即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].通過檢查測試標簽發(fā)現這個分類是正確的:
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)
讓我們用模型的預測繪制幾張圖像,即使置信度很高,模型也會出錯.
# 繪制一些測試圖像(預測標簽和真實標簽) #將正確預測用藍色表示,錯誤的預測用紅色表示 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模型經過優(yōu)化,可同時對一個或一組樣本進行預測.因此,即便我們只使用一個圖像,我們也需要將其添加到列表中.
# 添加圖像到只有一個單元的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模型會按照預期預測標簽.
總結
上述內容是講述進行一個基本分類項目的基本步驟,我們對細節(jié)不是很了解沒有關系,這里只是幫助我們拎起一個大的框架,讓我們知道在tensorflow框架下構建項目的簡潔性.后面我會繼續(xù)對該指南進行傻瓜式記錄,希望在復現別人項目的基礎上逐漸鞏固對機器學習的認識.
總結
以上是生活随笔為你收集整理的2.利用tensorflow框架对服装进行分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海阔凭鱼跃 天高任鸟飞-大上海,人人都向
- 下一篇: java.exe点击无反应_win7系统