หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

การจำแนกพื้นฐาน: จำแนกภาพของเสื้อผ้า

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดสมุดบันทึก

คู่มือนี้จะฝึกอบรมโมเดลโครงข่ายประสาทเทียมเพื่อจำแนกภาพของเสื้อผ้าเช่นรองเท้าผ้าใบและเสื้อเชิ้ต ไม่เป็นไรถ้าคุณไม่เข้าใจรายละเอียดทั้งหมด นี่เป็นภาพรวมที่รวดเร็วของโปรแกรม TensorFlow ที่สมบูรณ์พร้อมรายละเอียดที่อธิบายในระหว่างการเดินทาง

คู่มือนี้ใช้ tf.keras API ระดับสูงเพื่อสร้างและฝึกอบรมโมเดลใน TensorFlow

 # TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)
 
2.3.0

นำเข้าชุดข้อมูล Fashion MNIST

 fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
 
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step

การโหลดชุดข้อมูลส่งคืนอาร์เรย์ NumPy สี่ชุด:

  • train_images และ train_labels อาร์เรย์มีการฝึกอบรมตั้งค่าข้อมูล -The ใช้รูปแบบการเรียนรู้
  • รูปแบบการทดสอบกับชุดทดสอบที่ test_images และ test_labels อาร์เรย์

รูปภาพมีขนาด 28x28 NumPy ซึ่งมีค่าพิกเซลอยู่ระหว่าง 0 ถึง 255 เลเบล เป็นอาร์เรย์ของจำนวนเต็มตั้งแต่ 0 ถึง 9 สิ่งเหล่านี้สอดคล้องกับ ชั้น ของภาพที่แสดงถึงเสื้อผ้า:

ฉลาก ชั้น
0 เสื้อยืด / ด้านบน
1 กางเกง
2 เสื้อสวมหัว
3 แต่งตัว
4 เสื้อโค้ท
5 รองเท้าแตะ
6 เสื้อเชิ้ต
7 รองเท้าผ้าใบ
8 ถุง
9 บูตข้อเท้า

แต่ละภาพถูกแมปกับป้ายกำกับเดียว เนื่องจาก ชื่อคลาส ไม่รวมอยู่ในชุดข้อมูลให้เก็บไว้ที่นี่เพื่อใช้ในภายหลังเมื่อทำการพล็อตรูปภาพ:

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

สำรวจข้อมูล

มาสำรวจรูปแบบของชุดข้อมูลก่อนการฝึกแบบจำลอง ต่อไปนี้แสดงให้เห็นว่ามี 60,000 ภาพในชุดการฝึกอบรมโดยแต่ละภาพแสดงเป็น 28 x 28 พิกเซล:

 train_images.shape
 
(60000, 28, 28)

ในทำนองเดียวกันมีฉลาก 60,000 ชุดในชุดฝึกอบรม:

 len(train_labels)
 
60000

แต่ละป้ายกำกับเป็นจำนวนเต็มตั้งแต่ 0 ถึง 9:

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

มี 10,000 ภาพในชุดทดสอบ อีกครั้งแต่ละภาพแสดงเป็น 28 x 28 พิกเซล:

 test_images.shape
 
(10000, 28, 28)

และชุดทดสอบประกอบด้วยป้ายชื่อ 10,000 รูป:

 len(test_labels)
 
10000

ประมวลผลข้อมูลล่วงหน้า

ข้อมูลจะต้องดำเนินการก่อนการฝึกอบรมเครือข่าย หากคุณตรวจสอบภาพแรกในชุดฝึกอบรมคุณจะเห็นว่าค่าพิกเซลอยู่ในช่วง 0 ถึง 255:

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

PNG

ปรับขนาดค่าเหล่านี้ให้อยู่ในช่วง 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()
 

PNG

สร้างแบบจำลอง

การสร้างโครงข่ายประสาทเทียมต้องกำหนดค่าเลเยอร์ของแบบจำลองจากนั้นทำการรวบรวมแบบจำลอง

ตั้งค่าเลเยอร์

Building Block พื้นฐานของเครือข่ายประสาทเทียมคือ เลเยอร์ เลเยอร์แยกการแทนค่าจากข้อมูลที่ป้อนเข้ามา หวังว่าการเป็นตัวแทนเหล่านี้มีความหมายต่อปัญหาในมือ

การเรียนรู้อย่างลึกซึ้งส่วนใหญ่ประกอบด้วยการผูกมัดเลเยอร์เรียบง่ายเข้าด้วยกัน เลเยอร์ส่วนใหญ่เช่น 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.Dense ชั้นหนา ชั้นเหล่านี้เชื่อมต่อกันอย่างหนาแน่นหรือเชื่อมต่อกับชั้นประสาทอย่างสมบูรณ์ เลเยอร์ Dense แรกมี 128 โหนด (หรือเซลล์ประสาท) เลเยอร์ที่สอง (และสุดท้าย) ส่งคืนอาร์เรย์การบันทึกที่มีความยาว 10 แต่ละโหนดมีคะแนนที่ระบุว่ารูปภาพปัจจุบันเป็นของหนึ่งใน 10 คลาส

รวบรวมรูปแบบ

ก่อนที่โมเดลจะพร้อมสำหรับการฝึกอบรมจะต้องมีการตั้งค่าเพิ่มเติมอีกสองสาม สิ่งเหล่านี้จะถูกเพิ่มเข้าไปในขั้นตอนการ คอมไพล์ ของโมเดล:

  • ฟังก์ชั่นการสูญเสีย - เป็นการวัดความแม่นยำของแบบจำลองระหว่างการฝึก คุณต้องการย่อขนาดฟังก์ชั่นนี้เพื่อ "คัดท้าย" โมเดลในทิศทางที่ถูกต้อง
  • เครื่องมือเพิ่มประสิทธิภาพ - นี่คือวิธีการอัพเดตโมเดลตามข้อมูลที่เห็นและฟังก์ชั่นการสูญเสีย
  • ตัวชี้วัด - ใช้เพื่อตรวจสอบขั้นตอนการฝึกอบรมและการทดสอบ ตัวอย่างต่อไปนี้ใช้ ความถูกต้อง ส่วนของรูปภาพที่จำแนกอย่างถูกต้อง
 model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
 

ฝึกโมเดล

การฝึกอบรมโมเดลโครงข่ายประสาทเทียมต้องใช้ขั้นตอนต่อไปนี้:

  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 [==============================] - 2s 1ms/step - loss: 0.4973 - accuracy: 0.8255
Epoch 2/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.3743 - accuracy: 0.8639
Epoch 3/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.3345 - accuracy: 0.8782
Epoch 4/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.3128 - accuracy: 0.8860
Epoch 5/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.2937 - accuracy: 0.8925
Epoch 6/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.2815 - accuracy: 0.8961
Epoch 7/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.2673 - accuracy: 0.9012
Epoch 8/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.2573 - accuracy: 0.9038
Epoch 9/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.2470 - accuracy: 0.9077
Epoch 10/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.2393 - accuracy: 0.9113

<tensorflow.python.keras.callbacks.History at 0x7f5ca987cf60>

ในฐานะที่เป็นโมเดลรถไฟตัวชี้วัดการสูญเสียและความแม่นยำจะปรากฏขึ้น รุ่นนี้มีความแม่นยำประมาณ 0.91 (หรือ 91%) จากข้อมูลการฝึกอบรม

ประเมินความถูกต้อง

ถัดไปเปรียบเทียบประสิทธิภาพของโมเดลในชุดข้อมูลการทดสอบ:

 test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print('\nTest accuracy:', test_acc)
 
313/313 - 0s - loss: 0.3272 - accuracy: 0.8841

Test accuracy: 0.8841000199317932

ปรากฎว่าความแม่นยำของชุดข้อมูลทดสอบนั้นน้อยกว่าความแม่นยำของชุดข้อมูลการฝึกอบรมเพียงเล็กน้อย ช่องว่างระหว่างความแม่นยำในการฝึกอบรมและความแม่นยำในการทดสอบนี้แสดงให้เห็นถึง การมีน้ำหนัก เกิน การเกิด overfitting เกิดขึ้นเมื่อโมเดลการเรียนรู้ของเครื่องมีประสิทธิภาพลดลงสำหรับอินพุตใหม่ที่ไม่เคยเห็นมาก่อนจากข้อมูลการฝึกอบรม แบบจำลองที่ overfitted "จดจำ" เสียงรบกวนและรายละเอียดในชุดข้อมูลการฝึกอบรมจนถึงจุดที่ส่งผลกระทบต่อประสิทธิภาพการทำงานของแบบจำลองในข้อมูลใหม่ สำหรับข้อมูลเพิ่มเติมดูต่อไปนี้:

ทำการพยากรณ์

ด้วยแบบจำลองที่ได้รับการฝึกฝนคุณสามารถใช้มันเพื่อคาดการณ์เกี่ยวกับภาพบางภาพได้ เอาต์พุตเชิงเส้นของโมเดล บันทึก แนบเลเยอร์ softmax เพื่อแปลงการบันทึกเป็นความน่าจะเป็นซึ่งง่ายต่อการตีความ

 probability_model = tf.keras.Sequential([model, 
                                         tf.keras.layers.Softmax()])
 
 predictions = probability_model.predict(test_images)
 

ที่นี่แบบจำลองทำนายฉลากสำหรับภาพแต่ละภาพในชุดทดสอบ ลองดูคำทำนายแรก:

 predictions[0]
 
array([2.5733272e-07, 1.3352397e-09, 3.0229703e-09, 2.1916051e-09,
       9.3775823e-09, 1.2524406e-03, 3.0483918e-07, 6.3156984e-03,
       3.5332143e-08, 9.9243128e-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):
  true_label, img = 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):
  true_label = 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()
 

PNG

 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()
 

PNG

ลองพล็อตภาพหลายภาพด้วยการทำนาย โปรดทราบว่ารูปแบบอาจผิดแม้ว่ามั่นใจมาก

 # Plot the first X test images, their predicted labels, and the true labels.
# Color correct predictions in blue and incorrect predictions in red.
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()
 

PNG

ใช้รูปแบบการฝึกอบรม

สุดท้ายให้ใช้แบบจำลองที่ผ่านการฝึกอบรมเพื่อคาดการณ์เกี่ยวกับภาพเดียว

 # Grab an image from the test dataset.
img = test_images[1]

print(img.shape)
 
(28, 28)

แบบจำลอง tf.keras รับการปรับให้เหมาะสมเพื่อทำการคาดการณ์เกี่ยวกับ ชุด หรือชุดตัวอย่างในทันที ดังนั้นแม้ว่าคุณจะใช้ภาพเดียวคุณจำเป็นต้องเพิ่มลงในรายการ:

 # Add the image to a batch where it's the only member.
img = (np.expand_dims(img,0))

print(img.shape)
 
(1, 28, 28)

ตอนนี้คาดเดาป้ายกำกับที่ถูกต้องสำหรับภาพนี้:

 predictions_single = probability_model.predict(img)

print(predictions_single)
 
[[2.9163108e-05 7.2068375e-14 9.9900764e-01 1.8123520e-09 8.1888458e-04
  4.9270381e-13 1.4437248e-04 5.5026169e-19 3.3279272e-11 1.1571502e-16]]

 plot_value_array(1, predictions_single[0], test_labels)
_ = plt.xticks(range(10), class_names, rotation=45)
 

PNG

keras.Model.predict ส่งคืนรายการลิสต์หนึ่งรายการสำหรับแต่ละอิมเมจในกลุ่มของข้อมูล คว้าการคาดการณ์สำหรับภาพ (เฉพาะ) ของเราในแบทช์:

 np.argmax(predictions_single[0])
 
2

และตัวแบบทำนายฉลากตามที่คาดไว้

 
#
# Copyright (c) 2017 François Chollet
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
 

คู่มือนี้ใช้ชุดข้อมูล Fashion MNIST ซึ่งมีภาพสีเทา 70,000 ภาพใน 10 หมวดหมู่ ภาพแสดงแต่ละบทความของเสื้อผ้าที่ความละเอียดต่ำ (28 x 28 พิกเซล) ตามที่เห็นที่นี่:

แฟชั่น MNIST สไปรท์
รูปที่ 1 ตัวอย่าง Fashion-MNIST (โดย Zalando, MIT License)

Fashion MNIST มีวัตถุประสงค์เพื่อเป็นแบบดร อปดาวน์สำหรับ ชุดข้อมูล MNIST แบบคลาสสิกซึ่งมักใช้เป็น "Hello, World" ของโปรแกรมการเรียนรู้ของเครื่องสำหรับการมองเห็นด้วยคอมพิวเตอร์ ชุดข้อมูล MNIST มีภาพของตัวเลขที่เขียนด้วยลายมือ (0, 1, 2, ฯลฯ ) ในรูปแบบที่เหมือนกับบทความของเสื้อผ้าที่คุณจะใช้ที่นี่

คู่มือนี้ใช้ Fashion MNIST เพื่อความหลากหลายและเนื่องจากเป็นปัญหาที่ท้าทายกว่า MNIST ทั่วไปเล็กน้อย ชุดข้อมูลทั้งสองมีขนาดค่อนข้างเล็กและใช้เพื่อตรวจสอบว่าอัลกอริทึมทำงานตามที่คาดไว้ เป็นจุดเริ่มต้นที่ดีในการทดสอบและแก้ไขข้อบกพร่อง

ที่นี่มี 60,000 ภาพที่ใช้ในการฝึกอบรมเครือข่ายและ 10,000 ภาพเพื่อประเมินความถูกต้องของเครือข่ายที่เรียนรู้การจำแนกภาพ คุณสามารถเข้าถึง Fashion MNIST โดยตรงจาก TensorFlow นำเข้าและโหลดข้อมูลแฟชั่น MNIST โดยตรงจาก TensorFlow: