使用機器學習對圖片進行分類
服裝數據集
服裝數據集和MNIST數據集很像,有需要的可以查看教程《MNIST數據集》,包含70000個灰度圖,每個圖片28 x 28像素。
時裝數據集
在這里將使用60000張圖片進行訓練,使用10000張圖片進行評估,可以直接使用Keras進行加載。
fashion_mnist = tf.keras.datasets.fashion_mnist(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
所有的圖片可分為10個種類:
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
數據預處理:
在將數據送入到神經網絡訓練之前,需要對數據進行預處理,查看一張訓練的圖片,像素值的分布范圍為[0, 255]
鞋子
對數據進行歸一化處理:
train_images = train_images / 255.0test_images = test_images / 255.0
為了驗證數據的正確性,展示前25張圖片以及圖片的分類:
服裝
建立模型
神經網絡基礎模塊就是層(Layer),層會從傳遞的數據中提取特征,這些特征對問題的解決很有幫助。
很多深度學習都是由一系列簡單的層串聯而成,大部分的層比如Dense,在訓練過程中有可學習的參數。
model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10)])
Flatten層將二維(28 x 28)的圖片轉化為一維的數組,這一層沒有參數可以學習,僅僅只是格式化數據。
第一個Dense層有128個節點或者說神經元,第二個Dense層返回長度為10的數組,每個節點包含當前圖片屬于哪個分類的得分。
模型編譯
模型需要進行三個設置:
- 損失函數 - 這個主要用于評估模型在訓練過程中的準確性
- 優化器 - 模型如何更新
- 量度 - 用于監測訓練和測試步驟
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
填入訓練數據:
model.fit(train_images, train_labels, epochs=10)
評估模型的正確性:
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)print('Test accuracy:', test_acc)
顯示結果:
Test accuracy: 0.8835999965667725
訓練過程輸出:
1875/1875 [==============================] - 1s 523us/step - loss: 0.2379 - accuracy: 0.9110
可以看到測試數據的正確性是要略低于訓練數據的正確性的,這個訓練和測試的差距叫做overfitting(過擬合),過擬合發生在機器學習模型對于沒有處理過的數據表現更差。
預測
模型訓練之后,你可以使用它來對一些圖片進行預測,添加一個Softmax層將結果轉換為置信度,它更容易被理解
predictions = probability_model.predict(test_images)print(predictions[0])
可以看到第0張測試圖片屬于每個分類的置信度:
[4.7003473e-07 2.8711662e-09 1.8403462e-08 3.7643213e-09 2.0236126e-08 8.2177273e-04 1.0194674e-06 9.5114678e-02 2.8414237e-07 9.0406173e-01]
第9個數據的置信度最高,通過打印圖片的標簽也是9,說明預測正確。
隨機選擇一些圖片輸出:
置信度分布
第13張圖片81%的可能性是涼鞋,說明機器學習預測錯誤,它應該是跑鞋。
也可以對單張圖片進行預測,雖然是單張圖片,但是Keras仍然需要數組進行傳遞,將圖片添加到集合中。
img = (np.expand_dims(img, 0))
進行預測:
predictions_single = probability_model.predict(img)
總結
以上就是建立神經網絡的簡單過程,分為數據處理、模型的訓練、預測等幾個步驟。