เกี่ยวกับ Codelab นี้
1 ข้อควรทราบก่อนที่จะเริ่มต้น
ใน Codelab นี้ คุณจะสร้างโมเดลการมองเห็นคอมพิวเตอร์ที่จดจําเสื้อผ้าได้ด้วย TensorFlow
ข้อกำหนดเบื้องต้น
- ความรู้ที่ดีเกี่ยวกับ Python
- ทักษะการเขียนโปรแกรมพื้นฐาน
สิ่งที่จะได้เรียนรู้
ใน Codelab นี้ คุณจะทําสิ่งต่อไปนี้ได้
- ฝึกโครงข่ายระบบประสาทเทียมเพื่อจดจําเสื้อผ้า
- ทําแบบฝึกหัดชุดต่างๆ เพื่อแนะนําคุณผ่านการทดสอบกับเลเยอร์ต่างๆ ของเครือข่าย
สิ่งที่คุณจะสร้าง
- โครงข่ายระบบประสาทเทียมที่ระบุบทความเสื้อผ้า
สิ่งที่ต้องมี
หากไม่เคยสร้างเครือข่ายโครงข่ายประสาทสําหรับคอมพิวเตอร์วิทัศน์ด้วย TensorFlow เลย คุณจะใช้ Colaboratory ซึ่งเป็นสภาพแวดล้อมของเบราว์เซอร์ที่มีทรัพยากร Dependency ที่จําเป็นทั้งหมดได้ คุณค้นหาโค้ดสําหรับส่วนที่เหลือของ Codelab ได้อยู่ใน Colab
ไม่เช่นนั้น ภาษาหลักที่คุณใช้สําหรับโมเดลการฝึกคือ Python ดังนั้นคุณจะต้องติดตั้ง นอกจากนี้ คุณจะต้องมี TensorFlow และไลบรารี NumPy ด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับและติดตั้ง TensorFlow ได้ที่นี่ ติดตั้ง NumPy ที่นี่
2 เริ่มเขียนโค้ด
ขั้นแรก ให้ดูสมุดบันทึก Colab ที่ดําเนินการได้
เริ่มด้วยการนําเข้า TensorFlow
import tensorflow as tf
print(tf.__version__)
คุณจะฝึกเครือข่ายโครงข่ายประสาทให้จดจําเสื้อผ้าจากชุดข้อมูลทั่วไปที่เรียกว่าแฟชั่น MNIST ร้านเสื้อผ้าประกอบด้วยสินค้า 70,000 รายการใน 10 หมวดหมู่ เสื้อผ้าแต่ละชิ้นอยู่ในภาพโทนสีเทา 28x28 ดูตัวอย่างได้ที่นี่
ป้ายกํากับที่เชื่อมโยงกับชุดข้อมูล ได้แก่
ป้ายกํากับ | คำอธิบาย |
0 | การสกรีนเสื้อยืด |
1 | กางเกง |
2 | เสื้อสวมหัว |
3 | เสื้อชุดสตรี |
4 | เสื้อโค้ท |
5 | รองเท้ามีสายรัด |
6 | เสื้อ |
7 | รองเท้าผ้าใบ |
8 | กระเป๋า |
9 | รองเท้าบูทหุ้มข้อ |
ข้อมูล Fashion MNIST มีอยู่ใน tf.keras.datasets
API โหลดดังนี้
mnist = tf.keras.datasets.fashion_mnist
การเรียกใช้ load_data
ในออบเจ็กต์นั้นประกอบด้วยรายการ 2 ชุด ได้แก่ ค่า training และ test ซึ่งแสดงถึงกราฟิกที่แสดงรายการเสื้อผ้าและป้ายกํากับ
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
ค่าเหล่านั้นมีลักษณะอย่างไร พิมพ์รูปภาพการฝึกอบรมและป้ายกํากับการฝึกอบรมเพื่อดู คุณอาจทดสอบกับดัชนีต่างๆ ในอาร์เรย์
import matplotlib.pyplot as plt
plt.imshow(training_images[0])
print(training_labels[0])
print(training_images[0])
การพิมพ์ข้อมูลของรายการ 0
มีลักษณะดังนี้
คุณจะสังเกตเห็นว่าค่าทั้งหมดเป็นจํานวนเต็มระหว่าง 0 ถึง 255 เมื่อฝึกเครือข่ายระบบประสาท จะสามารถรักษาค่าทั้งหมดระหว่าง 0 ถึง 1 กระบวนการที่เรียกว่าการปรับให้สอดคล้องตามมาตรฐานได้ง่ายขึ้น โชคยังดีที่ Python มอบวิธีที่ง่ายในการปรับรายการให้เป็นปกติโดยไม่ต้องวนซ้ํา
training_images = training_images / 255.0
test_images = test_images / 255.0
คุณอาจพิจารณาที่ 42 ซึ่งเป็นการเปิดเครื่องอื่นที่ไม่ใช่เครื่องที่ดัชนี 0
ตอนนี้คุณอาจสงสัยว่าทําไมถึงมีชุดข้อมูล 2 ชุด ได้แก่ การฝึกอบรมและการทดสอบ
แนวคิดคือการมีชุดข้อมูลหนึ่งสําหรับการฝึกอบรม และอีกชุดข้อมูลหนึ่งที่โมเดลยังไม่พบ เพื่อดูว่าโมเดลแยกประเภทค่าได้ดีเพียงใด เมื่อทําเสร็จแล้ว คุณจะต้องใช้โมเดลกับข้อมูลที่ยังไม่เคยเห็นมาก่อน นอกจากนี้ เมื่อไม่มีข้อมูลการทดสอบแยกต่างหาก คุณจะที่ให้ความเสี่ยงด้านเครือข่ายที่จดจําข้อมูลการฝึกอบรมเท่านั้นโดยไม่ต้องระบุทั่วไปถึงความรู้
3 ออกแบบโมเดล
มาออกแบบโมเดลกันเลย คุณจะมี 3 เลเยอร์ เลือกดูทีละรายการและศึกษาเลเยอร์และพารามิเตอร์ประเภทต่างๆ ที่ใช้สําหรับแต่ละรายการ
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
Sequential
กําหนดลําดับของเลเยอร์ในเครือข่ายระบบประสาทFlatten
ใช้รูปสี่เหลี่ยมจัตุรัสและเปลี่ยนให้เป็นเวกเตอร์มิติเดียวDense
เพิ่มเลเยอร์เซลล์ประสาท- ฟังก์ชัน
Activation
บอกชั้นเซลล์ประสาทว่าต้องทําอะไร มีตัวเลือกมากมายแต่ให้ใช้ตอนนี้ Relu
หมายความว่าหาก X มากกว่า 0 แสดงผล X จะหมายถึง 0 แสดงผล ระบบจะส่งเฉพาะค่า 0 ขึ้นไปไปยังเลเยอร์ถัดไปในเครือข่ายSoftmax
จะใช้ชุดค่าและเลือกค่าที่ดีที่สุดอย่างมีประสิทธิภาพ ตัวอย่างเช่น หากเอาต์พุตของเลเยอร์สุดท้ายมีลักษณะเป็น [0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05] ก็จะไม่ต้องจัดเรียงให้ค่าสูงสุด กล่าวคือจะแสดงผล [0,0,0,0,1,0,0,0,0]
4 คอมไพล์และฝึกโมเดล
เมื่อกําหนดรูปแบบแล้ว สิ่งที่คุณต้องทําก็คือสร้างโมเดล สร้างโมเดลโดยคอมไพล์ก่อนด้วยฟังก์ชัน optimizer
และ loss
แล้วฝึกโมเดลในข้อมูลการฝึกและป้ายกํากับ โดยมีเป้าหมายเพื่อให้โมเดลเข้าใจความสัมพันธ์ระหว่างข้อมูลการฝึกอบรมและป้ายกํากับการฝึก ต่อมา คุณสามารถอยากให้โมเดลเห็นข้อมูลที่คล้ายกับข้อมูลการฝึก จากนั้นให้คาดการณ์ลักษณะของข้อมูลนั้น
สังเกตการใช้ metrics=
เป็นพารามิเตอร์ซึ่งช่วยให้ TensorFlow รายงานความแม่นยําของการฝึกอบรมด้วยการตรวจสอบผลลัพธ์ที่คาดการณ์กับคําตอบที่รู้จัก (ป้ายกํากับ)
model.compile(optimizer = tf.keras.optimizers.Adam(),
loss = 'sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
เมื่อ model.fit
ดําเนินการ คุณจะเห็นการสูญเสียและความถูกต้อง:
Epoch 1/5 60000/60000 [=======] - 6s 101us/sample - loss: 0.4964 - acc: 0.8247 Epoch 2/5 60000/60000 [=======] - 5s 86us/sample - loss: 0.3720 - acc: 0.8656 Epoch 3/5 60000/60000 [=======] - 5s 85us/sample - loss: 0.3335 - acc: 0.8780 Epoch 4/5 60000/60000 [=======] - 6s 103us/sample - loss: 0.3134 - acc: 0.8844 Epoch 5/5 60000/60000 [=======] - 6s 94us/sample - loss: 0.2931 - acc: 0.8926
เมื่อฝึกโมเดลเสร็จแล้ว คุณจะเห็นค่าความแม่นยําในตอนท้ายของยุคสุดท้าย อาจอยู่ในรูปแบบ 0.8926 ด้านบน สัญญาณนี้จะบอกคุณว่าโครงข่ายระบบประสาทเทียมมีความแม่นยําในการแยกประเภทข้อมูลการฝึกประมาณ 89% กล่าวอีกนัยหนึ่งคือ รูปแบบได้จับคู่รูปแบบกับรูปภาพที่มีประสิทธิภาพ 89% ของเวลาทั้งหมด ไม่ได้มีดีนักแต่ก็ไม่ถือว่าถูกฝึกมาเพียง 5 ตอนและเสร็จสิ้นอย่างรวดเร็ว
5 ทดสอบโมเดล
โมเดลจะใช้งานข้อมูลที่ไม่เห็นได้อย่างไร คุณจึงมีชุดการทดสอบ คุณเรียก model.evaluate
และโอนในทั้ง 2 ชุด แล้วรายงานการสูญเสียแต่ละชุด ลองใช้เลย
model.evaluate(test_images, test_labels)
และผลลัพธ์ที่ได้มีดังนี้
10000/10000 [=====] - 1s 56us/sample - loss: 0.3365 - acc: 0.8789 [0.33648381242752073, 0.8789]
ตัวอย่างดังกล่าวแสดงผล .8789 ได้อย่างถูกต้อง ซึ่งหมายความว่ามีความถูกต้องประมาณ 88% (คุณอาจมีค่าต่างกันเล็กน้อย)
โมเดลก็ไม่ถูกต้องด้วยข้อมูลที่ไม่รู้จักเท่าที่ฝึกกับข้อมูลการฝึก ขณะที่คุณดูข้อมูลเพิ่มเติมเกี่ยวกับ TensorFlow จะพบวิธีปรับปรุง
หากต้องการสํารวจเพิ่มเติม ให้ลองออกกําลังกายในขั้นตอนถัดไป
6 แบบฝึกหัดการสํารวจ
การออกกําลังกาย 1
ทําแบบฝึกหัดแรกโดยเรียกใช้โค้ดต่อไปนี้
classifications = model.predict(test_images)
print(classifications[0])
จากนั้นจะสร้างชุดการแยกประเภทรูปภาพทดสอบแต่ละภาพ จากนั้นพิมพ์รายการแรกในการแยกประเภท ผลลัพธ์หลังจากที่คุณเรียกใช้จะเป็นรายการตัวเลข คุณคิดว่าตัวเลขดังกล่าวคืออะไรและตัวเลขเหล่านั้นแสดงถึงอะไร
ลองเรียกใช้ print(test_labels[0])
แล้วคุณจะได้รับ 9 วิธีนี้จะช่วยให้คุณเข้าใจสาเหตุที่ทําให้รายการมีลักษณะเป็นอย่างไร
ผลลัพธ์ที่ได้จากโมเดลนี้ประกอบด้วยตัวเลข 10 หลัก ตัวเลขเหล่านั้นมีแนวโน้มที่ค่าที่จะจัดประเภทจะเป็นป้ายกํากับที่เกี่ยวข้อง เช่น ค่าแรกในรายการคือความน่าจะเป็นที่เสื้อผ้าจะเป็นคลาส 0 และถัดไปเป็น 1 โปรดสังเกตว่ามีความน่าจะเป็นต่ํามาก ยกเว้นอย่างใดอย่างหนึ่ง นอกจากนี้ เนื่องจาก Softmax
ความน่าจะเป็นทั้งหมดในรายการจะเท่ากับ 1.0
รายการและป้ายกํากับเป็นเลข 0 ดังนั้นรองเท้าบูทหุ้มข้อที่มีป้ายกํากับ 9 หมายความว่าเป็นที่ 10 ของทั้ง 10 คลาส รายการที่มีองค์ประกอบที่ 10 เป็นค่าสูงสุดหมายความว่าโครงข่ายระบบประสาทเทียมได้คาดเดาว่ารายการที่ได้รับการจัดประเภทนั้นมีแนวโน้มสูงสุดที่จะเปิดข้อเท้า
การออกกําลังกาย 2
ดูเลเยอร์ในโมเดลของคุณ ทดลองใช้ค่าที่แตกต่างกันสําหรับเลเยอร์ที่หนาแน่นด้วยเซลล์ประสาท 512 เซลล์
ผลลัพธ์ใดที่คุณได้รับจากการสูญเสียและการฝึกอบรม คุณคิดว่าเป็นกรณีอะไร
ตัวอย่างเช่น หากเพิ่มเซลล์ประสาทเป็น 1,024 เซลล์ คุณจะต้องคํานวณเพิ่มเติมซึ่งทําให้กระบวนการช้าลง แต่ในกรณีนี้ รูปแบบนั้นให้ผลลัพธ์ที่ดีเนื่องจากโมเดลมีความแม่นยํามากกว่า และไม่ได้หมายความว่าจะดีขึ้นเสมอไป คุณสามารถลดการลดจํานวนผลตอบแทนได้อย่างรวดเร็ว
การออกกําลังกาย 3
จะเกิดอะไรขึ้นหากคุณนําเลเยอร์ Flatten()
ออก คุณคิดว่าเป็นกรณีอะไร
คุณจะได้รับข้อผิดพลาดเกี่ยวกับรูปร่างของข้อมูล รายละเอียดของข้อผิดพลาดอาจดูไม่ชัดเจนในตอนนี้ แต่จะช่วยเสริมหลักการสําคัญว่าเลเยอร์แรกในเครือข่ายของคุณควรมีรูปทรงเดียวกับข้อมูล ตอนนี้ข้อมูลของคุณคือขนาด 28x28 และขนาด 28 ชั้นของเซลล์ประสาท 28 ชั้นคงทําไม่ได้ ดังนั้นคุณจึงควรแยกขนาด 28.28 เป็นขนาด 784x1 แทน
แทนที่จะต้องเขียนโค้ดทั้งหมด ให้เพิ่มเลเยอร์ Flatten()
ไว้ที่ตอนต้น เมื่อมีการโหลดอาร์เรย์ลงในโมเดลในภายหลัง ระบบจะแยกอาร์เรย์เหล่านั้นให้คุณโดยอัตโนมัติ
การออกกําลังกาย 4
พิจารณาเลเยอร์สุดท้าย (เอาต์พุต) เหตุใดจึงมี 10 ช่อง จะเกิดอะไรขึ้นหากคุณมีจํานวนเงินที่ต่างจาก 10
ลองฝึกเครือข่ายด้วย 5 คุณจะได้รับข้อผิดพลาดทันทีที่พบค่าที่ไม่คาดคิด กฎทั่วไปอีกข้อหนึ่งของจํานวนเซลล์ประสาทในเลเยอร์สุดท้ายควรตรงกับจํานวนคลาสที่คุณจัดประเภทให้ ในกรณีนี้ ตัวเลขนี้มีค่าตั้งแต่ 0 ถึง 9 ดังนั้นตัวเลข 10 หลักจึงมี 10 เซลล์ในเลเยอร์สุดท้าย
การออกกําลังกาย 5
พิจารณาผลกระทบของเลเยอร์เพิ่มเติมในเครือข่าย จะเกิดอะไรขึ้นหากคุณเพิ่มเลเยอร์อื่นระหว่างเลเยอร์ 512 กับเลเยอร์สุดท้ายที่มี 10 ชั้น
ไม่มีผลกระทบที่มีนัยสําคัญ เนื่องจากนี่เป็นข้อมูลที่ค่อนข้างเรียบง่าย สําหรับข้อมูลที่ที่ซับซ้อนกว่านั้น มักจะต้องใช้เลเยอร์เพิ่มเติม
การออกกําลังกาย 6
ก่อนการฝึก คุณทําข้อมูลให้เป็นมาตรฐาน โดยเริ่มจากค่า 0 ถึง 255 เป็นค่า 0 ถึง 1 การนําโฆษณาออกจะส่งผลอย่างไร ลองดูโค้ดแบบเต็มนี้เพื่อลองใหม่ (โปรดทราบว่าจะมีการตรวจสอบทั้ง 2 บรรทัดที่ทําให้ข้อมูลถูกต้อง)
ทําไมคุณจึงคิดว่าได้ผลลัพธ์ที่ต่างกัน เรามีคําตอบที่ยอดเยี่ยมให้ที่นี่เกี่ยวกับ Stack Overflow
import tensorflow as tf
print(tf.__version__)
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
#training_images=training_images/255.0
#test_images=test_images/255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(training_images, training_labels, epochs=5)
model.evaluate(test_images, test_labels)
classifications = model.predict(test_images)
print(classifications[0])
print(test_labels[0])
7 สํารวจโค้ดเรียกกลับ
ก่อนหน้านี้เมื่อคุณฝึกสําหรับ Epoch เพิ่มเติม คุณพบปัญหาที่อาจสูญเสียไป ซึ่งอาจต้องใช้เวลาสักระยะหนึ่งเพื่อรอให้การฝึกอบรมเสร็จสิ้น และคุณอาจคิดว่าการฝึกอบรมก็คงจะดีหากคุณหยุดการฝึกอบรมได้เมื่อได้ค่าตามที่ต้องการ เช่น ความแม่นยํา 95% หากเข้าถึงหลังจาก 3 Epoch แล้ว ให้รอจนจะต้องทํา Epoch อีกหลายรอบก่อน
เช่นเดียวกับโปรแกรมอื่น คุณมีสิทธิ์โทรกลับ ดูของจริง
import tensorflow as tf
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if(logs.get('accuracy')>0.95):
print("\nReached 95% accuracy so cancelling training!")
self.model.stop_training = True
callbacks = myCallback()
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images/255.0
test_images=test_images/255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5, callbacks=[callbacks])
8 ยินดีด้วย
คุณได้สร้างรูปแบบคอมพิวเตอร์วิทัศน์เป็นครั้งแรกแล้ว หากต้องการดูวิธีเพิ่มประสิทธิภาพโมเดลคอมพิวเตอร์วิทัศน์ของคุณ โปรดไปที่หัวข้อสร้างการปฏิวัติและรวบรวมกฎ