![]() | ![]() | ![]() | ![]() |
מדריך זה מאמן מודל רשת עצבי לסיווג תמונות של בגדים, כמו נעלי ספורט וחולצות. זה בסדר אם אתה לא מבין את כל הפרטים; זוהי סקירה מהירה של תוכנית TensorFlow מלאה עם הפרטים מוסברים תוך כדי.
מדריך זה משתמש ב- tf.keras , ממשק API ברמה גבוהה לבניית והכשרת דגמים ב- TensorFlow.
# TensorFlow and tf.keras
import tensorflow as tf
# Helper libraries
import numpy as np
import matplotlib.pyplot as plt
print(tf.__version__)
2.3.1
ייבא את מערך האופנה MNIST
מדריך זה משתמש במערך הנתונים של Fashion MNIST המכיל 70,000 תמונות בגווני אפור ב -10 קטגוריות. בתמונות נראים פריטי לבוש בודדים ברזולוציה נמוכה (28 על 28 פיקסלים), כפי שנראה כאן:
![]() |
איור 1. דוגמאות אופנה-MNIST (מאת זלנדו, רישיון MIT). |
Fashion MNIST מיועד כתחליף טיפה למערך הנתונים הקלאסי של MNIST - המשמש לעתים קרובות כ"הלו , העולם "של תוכניות למידת מכונה לראיית מחשב. מערך הנתונים MNIST מכיל תמונות של ספרות בכתב יד (0, 1, 2 וכו ') בפורמט זהה לזה של פריטי הלבוש שתשתמשו כאן.
מדריך זה משתמש ב- MNIST של אופנה לצורך מגוון, ומכיוון שזו בעיה מעט מאתגרת יותר מ- MNIST רגיל. שני מערכי הנתונים קטנים יחסית ומשמשים לאימות שאלגוריתם פועל כצפוי. הן נקודות התחלה טובות לבדיקת קוד וניקוי באגים.
כאן, 60,000 תמונות משמשות לאימון הרשת ו -10,000 תמונות להערכת מידת הדיוק של הרשת לסווג תמונות. אתה יכול לגשת ל- MNIST האופנה ישירות מ- TensorFlow. ייבא וטען את נתוני MNIST האופנה ישירות מ- TensorFlow:
fashion_mnist = tf.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_labels
train_images
train_labels
הם מערך האימונים - הנתונים שהמודל משתמש בהם כדי ללמוד. - המודל נבדק על פי מערך הבדיקה ,
test_images
test_labels
.
התמונות הן מערכי NumPy בגודל 28x28, עם ערכי פיקסלים שנעים בין 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()
קנה מידה של ערכים אלה לטווח של 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 = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
השכבה הראשונה ברשת זו, tf.keras.layers.Flatten
, הופכת את הפורמט של התמונות ממערך דו מימדי (של 28 על 28 פיקסלים) למערך חד ממדי (של 28 * 28 = 784 פיקסלים). חשוב על שכבה זו כעל ביטול ערימת שורות של פיקסלים בתמונה ומיישר אותם. לשכבה זו אין פרמטרים ללמוד; זה רק מחדש את הנתונים.
לאחר פיקסלים שטוחים, הרשת מורכבת מרצף של שתי שכבות tf.keras.layers.Dense
. אלה הם שכבות עצביות מחוברות בצפיפות, או מחוברות לחלוטין. בשכבה Dense
הראשונה יש 128 צמתים (או נוירונים). השכבה השנייה (והאחרונה) מחזירה מערך logits באורך 10. כל צומת מכיל ציון המציין שהתמונה הנוכחית שייכת לאחת מ -10 המחלקות.
הידר את המודל
לפני שהמודל מוכן לאימון, הוא זקוק לעוד כמה הגדרות. אלה מתווספים במהלך שלב הידור של המודל:
- תפקוד אובדן - זה מודד עד כמה המודל מדויק במהלך האימון. אתה רוצה למזער פונקציה זו כדי "לכוון" את המודל בכיוון הנכון.
- מיטוב אופטימיזציה - כך מתעדכן המודל על סמך הנתונים שהוא רואה ותפקוד האובדן שלו.
- מדדים - משמש לניטור שלבי ההדרכה והבדיקה. הדוגמה הבאה משתמשת ברמת דיוק , שבר התמונות המסווגות כהלכה.
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
תאמן את המודל
הכשרת מודל הרשת העצבית דורשת את השלבים הבאים:
- הזן את נתוני האימון למודל. בדוגמה זו, נתון ההכשרה נמצאים
train_images
וtrain_labels
המערכים. - המודל לומד לשייך תמונות ותוויות.
- אתה מבקש מהמודל לבצע חיזויים לגבי מערך בדיקות - בדוגמה זו, מערך
test_images
. - ודא שהתחזיות תואמות את התוויות ממערך
test_labels
.
הזן את הדגם
כדי להתחיל באימון, התקשר לשיטת model.fit
- מה שנקרא מכיוון שהיא "מתאימה" את המודל לנתוני האימון:
model.fit(train_images, train_labels, epochs=10)
Epoch 1/10 1875/1875 [==============================] - 3s 1ms/step - loss: 0.4917 - accuracy: 0.8277 Epoch 2/10 1875/1875 [==============================] - 3s 1ms/step - loss: 0.3702 - accuracy: 0.8674 Epoch 3/10 1875/1875 [==============================] - 3s 2ms/step - loss: 0.3328 - accuracy: 0.8793 Epoch 4/10 1875/1875 [==============================] - 3s 1ms/step - loss: 0.3106 - accuracy: 0.8859 Epoch 5/10 1875/1875 [==============================] - 3s 1ms/step - loss: 0.2915 - accuracy: 0.8927 Epoch 6/10 1875/1875 [==============================] - 3s 1ms/step - loss: 0.2771 - accuracy: 0.8968 Epoch 7/10 1875/1875 [==============================] - 3s 1ms/step - loss: 0.2666 - accuracy: 0.9008 Epoch 8/10 1875/1875 [==============================] - 3s 1ms/step - loss: 0.2547 - accuracy: 0.9055 Epoch 9/10 1875/1875 [==============================] - 3s 1ms/step - loss: 0.2439 - accuracy: 0.9097 Epoch 10/10 1875/1875 [==============================] - 3s 2ms/step - loss: 0.2370 - accuracy: 0.9115 <tensorflow.python.keras.callbacks.History at 0x7fd5c7912b00>
כאשר המודל מתאמן, מדדי האובדן והדיוק מוצגים. מודל זה מגיע לדיוק של כ- 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.3637 - accuracy: 0.8693 Test accuracy: 0.8693000078201294
מתברר שהדיוק במערך הבדיקה הוא מעט פחות מהדיוק במערך האימונים. פער זה בין דיוק האימונים לדיוק המבחנים מייצג התאמת יתר . התאמת יתר מתרחשת כאשר מודל למידת מכונה מבצע ביצועים גרועים יותר בתשומות חדשות שטרם נראו בעבר מאשר בנתוני האימון. מודל מאובזר יתר על המידה "משנן" את הרעש והפרטים במערך האימונים עד לנקודה בה הוא משפיע לרעה על ביצועי המודל על הנתונים החדשים. למידע נוסף, ראה את הדברים הבאים:
לעשות תחזיות
בעזרת המודל המאומן תוכלו להשתמש בו לחיזוי תמונות מסוימות. התפוקות הליניאריות של המודל, כניסה . צרף שכבת softmax כדי להמיר את הלוגיסטים להסתברויות, שקל יותר לפרש.
probability_model = tf.keras.Sequential([model,
tf.keras.layers.Softmax()])
predictions = probability_model.predict(test_images)
הנה, המודל חזה את התווית עבור כל תמונה בערכת הבדיקות. בואו נסתכל על התחזית הראשונה:
predictions[0]
array([5.1698703e-07, 5.0422708e-11, 1.0513627e-06, 4.2676376e-08, 4.1753174e-07, 8.8213873e-04, 1.4294442e-06, 8.9591898e-02, 3.7699414e-07, 9.0952224e-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()
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()
בואו לשרטט כמה תמונות עם התחזיות שלהם. שים לב שהדגם יכול להיות שגוי גם כשהוא בטוח מאוד.
# 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()
השתמש במודל המאומן
לסיום, השתמש במודל המאומן בכדי לחזות תמונה אחת.
# 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)
[[1.2673076e-05 1.9937504e-13 9.9978513e-01 1.8617269e-11 1.3060638e-04 2.2522463e-12 7.1663781e-05 1.4157123e-21 3.1792444e-11 1.6293697e-13]]
plot_value_array(1, predictions_single[0], test_labels)
_ = plt.xticks(range(10), class_names, rotation=45)
tf.keras.Model.predict
מחזירה רשימת רשימות - רשימה אחת לכל תמונה באוסף הנתונים. קח את התחזיות עבור התמונה (היחידה) שלנו באצווה:
np.argmax(predictions_single[0])
2
והמודל מנבא תווית כצפוי.
# MIT License
#
# 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.