למידת מכונה : סיווג תמונות באמצעות מודל VGG16 (חלק ד) - הערכת המודל

מחבר:
בתאריך:

בשלושת המדריכים הקודמים בסדרה פיתחנו מודל לסיווג תמונות באמצעות למידת מכונה וייעוד מחדש של מודל קיים VGG16. מודל מוצלח מצליח להכליל מסט הנתונים שעליהם הוא פותח לנתונים אחרים שאליהם הוא לא נחשף במהלך תהליך הפיתוח. כפי שראינו במדריך קודם המודל אותו פיתחנו הצליח לסווג נכונה למעלה מ-97% מהתמונות בסט המבחן, למרות שהמודל לא נחשף לתמונות אילו בתהליך האימון.

במדריך זה נמשיך לנסות ולהעריך את מידת האמינות של המודל בגישות שונות.

להורדת קוד הפרויקט שאותו נפתח במדריך

 

האם המודל ידע לסווג תמונה אחת מסוימת?

הקוד הבא בוחן את יכולות הסיווג של המודל על תמונה אחת שבחרתי באופן שרירותי.

# to get a taste predict a single image

from skimage import transform

np_image = Image.open('dataset/test/dogs/dog.0.jpg')
np_image = np.array(np_image).astype('float32')
np_image = transform.resize(np_image, (224, 224, 3))
np_image = np.expand_dims(np_image, axis=0)
  
predict = new_model.predict(np_image)

predict

התוצאה:

array([[4.6305784e-20, 1.0000000e+00]], dtype=float32)

הפונקציה predict מעריכה את מידת הסבירות שהתמונה שייכת לאחת מהקטגוריות. הפונקציה פולטת מערך ההסתברויות, כאשר כל פריט במערך מכיל את ההסתברות להשתייכות של תמונה אחת מסט הנתונים לאחת משתי הקטגוריות שאליהם המודל מיועד לסווג.

בתוצאה זו המודל מעריך את הסבירות שהתמונה שייכת לקטגוריה השנייה כגבוהה יותר (למעשה 100%).

נזכיר לעצמנו איזו מהקטגוריות מייצגת כלבים ואיזה חתולים.

# just a reminder - that's the class indices the Keras used
labels = (train_batches.class_indices)

labels
{'cats': 0, 'dogs': 1}

אכן המודל הצליח לסווג את התמונה נכונה לקטגוריית הכלבים.

 

מה מידת הסיווג הנכון של כל סט נתוני המבחן?

אחרי שראינו את יכולות הסיווג של המודל על תמונה אחת, נבחן את מידת הדיוק של הסיווג על כל התמונות בסט המבחן. הקוד הבא בוחן את מידת הסיווג הנכון של כל סט נתוני המבחן:

# predict all the images in the test dataset
# but first reset the test generator so you'll get the images in the correct order
# because you can't be sure were the generator stopped
test_batches.reset()
predictions = new_model.predict_generator(test_batches,steps=step_size_test,verbose=1)

קודם כל, אתחלנו את ה-data generator כדי שנקבל את התמונות בסדר הנכון החל מהתמונה הראשונה כי התכונה של ה-generator שהוא עובד ללא הפסקה (בניגוד ללולאה רגילה) ולכן אנחנו לא יכולים להיות בטוחים שהוא מתחיל לרוץ מתחילת סט הנתונים.

נציץ במערך התחזיות:

# running the above code will give output in probabilities that we need to convert to class indices.
# in our case it is 2 classes, 0 or 1.
predictions
array([[1.0000000e+00, 0.0000000e+00],
       [1.0000000e+00, 2.7761075e-37],
       [1.0000000e+00, 0.0000000e+00],
       ...,
       [0.0000000e+00, 1.0000000e+00],
       [9.9999988e-01, 1.1117572e-07],
       [0.0000000e+00, 1.0000000e+00]], dtype=float32)

אפשר להציג את התוצאות באופן דחוס יותר על ידי כך שנסיק מכל אחד מהמערכים במערך התחזיות את התחזית בפועל על פי הקטגוריה שקיבלה את הסבירות הגבוהה יותר. לדוגמה, במערך הראשון התחזית הראשונה קיבלה 100% ולכן זה חתול אז נסמן אותו ב-0, במערך השני גם כן חתול ולכן יסומן ב-0, והמערך האחרון יסומן ב-1 כי המודל זיהה כלב.

# predicted class indices
y_pred = np.argmax(predictions,axis=1)
y_pred
array([0, 0, 0, ..., 1, 0, 1])

תוצאות הסעיף הזה ישמשו אותנו מיד לצורך בניית confusion matrix.

 

הערכת מידת הסיווג הנכון באמצעות confusion matrix

אנחנו יודעים שהמודל מסווג נכונה למעלה מ-97% מהדוגמאות, אבל באיזו מהקטגוריות המודל צודק יותר או אילו מקרים מבלבלים אותו יותר. האם היו אילו כלבים שסווגו בטעות כחתולים או הפוך? כדי לענות על שאלות אילו נעזר ב-confusion matrix.

from sklearn.metrics import classification_report, confusion_matrix

# by the Confusion Matrix and Classification Report of sklearn y_pred = np.argmax(predictions, axis=1) print('Confusion Matrix') print(confusion_matrix(test_batches.classes, y_pred)) print('Classification Report') target_names = ['Cats', 'Dogs'] print(classification_report(test_batches.classes, y_pred, target_names=target_names))
Confusion Matrix
[[1223   27]
 [  39 1211]]

סידרתי את ה-confusion matrix באופן שיקל עלינו להעריך את התוצאות

  Predicted cats Predicted dogs
Actual cats 1223 23
Actual dogs 39 1211

אפשר לראות שאחוז הדיוק הוא גבוה וגם שהמערכת נוטה יותר לשגות ולזהות כלבים כחתולים מאשר חתולים ככלבים.

 

הערכת המודל באמצעות צפייה בתמונות שהמודל שגה בסיווגם

נציג 9 מהתמונות שהמודל שגה בסיווגם כדי לנסות להבין מה גרם לשגיאה:

# Plot 9 of the misclassified images
incorrect = (y_pred != test_batches.classes)

image_paths_test = [os.path.join(test_path, filename) for filename in test_batches.filenames]

misclassified_image_paths = np.array(image_paths_test)[incorrect]

misclassified_image_classes = y_pred[incorrect]

plot_images(misclassified_image_paths[23:33], misclassified_image_classes[23:33])

דוגמאות לתמונות שהמודל שגה בסיווגם

תמונה 1 מציגה כלב וחתול באותה התמונה וב-9 נראה כלב טלוא מאחור כך שאני יכול להבין מה סיבת השגיאה. אבל קשה לי להבין מדוע תמונה 7 שהיא תמונה קלאסית של כלב זאב הצליחה להטעות את המערכת.

 

סיכום

בסדרה הזו של 4 מדריכים למדנו כיצד להשתמש במודל קיים שפותח על ידי מיטב המוחות בתחום הבינה המלאכותית לצורך פתרון בעיית סיווג שונה. אפשר להשתמש בגישה הזו כדי לפתור מגוון רחב של בעיות. לדוגמה, זיהוי של תוצאות בדיקת MRI על ידי תוכנה במקום בודק אנושי. היתרונות הם שהמכונה יכולה לראות אין סוף תמונות בלי להתעייף וככל שהיא תראה יותר תמונות כך יכולות הסיווג שלה ישתפרו. גישה כזו גם יכולה להיות זולה בהרבה מפני שעלות שעת עבודה של רופא מומחה גדולה בסדרי גודל יותר מאשר עלות הפעלה של תוכנה שרצה בענן על שרת של גוגל או אמאזון או על מחשב ביתי מצויד ב-GPU.

לכל המדריכים בסדרה על למידת מכונה

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים