ממשיכים בסדרה שלי על בניית רשתות קונבלציונליות קלאסיות שממנן השתנה השדה של הראייה ב-1-2 עשורים האחרונים, אנחנו בעוד מבנים VGG, רשת קונבלציונלית מאוד עמוקה, מתחילה בPyTorch. אתם יכולים לראות את המאמרים הקודמים בסדרה על הפרופיל שלי, בעיקר LeNet5 וAlexNet.
כמו בפעם הקודמת, נבדוק את הארכיטקטורה וההגיון מאחורי VGG ואיך התוצאות היו באותה התקופה. אחר כך, נחקור את המידע שלנו, CIFAR100, ונטען אותו לתוכנית שלנו באמצעות קוד יעיל לזכוכית. אחר כך, ניתן את VGG16 (המספר מתייחס למספר השכבות, יש שני גירסאות בעיקרון לVGG16 וVGG19) מתחילה בPyTorch ואז נאמן אותו על המידע שלנו ביחד עם בדיקתו על המבחן כדי לראות איך הוא מביא תוצאות על מידע שלא נראה לשעבר
VGG
בעזרת העבודה של AlexNet, VGG מתמקד באסpect החשוב האחר, של רשתות מונחתות (CNNs), עומס. היא פותחה על-ידי Simonyan וZisserman. היא בדרך כלל מורכבת מ-16 שכבות מונחתות אבל יכולה להתרחב ל-19 שכבות (לכן יש שני גירסאות, VGG-16 וVGG-19). כל השכבות המונחתות מורכבות מפילטרים 3×3. ניתן לקרוא על הרשת במאמר הרשמי פה
על מבנה VGG16. מקור
טעיית מידע
קבוצת מידע
לפני שיבנינו את המודל, אחד הדברים הכי חשובים בפרוייקט למידת מכונה כלשהו הוא לטעון, לנתח ולטיפול במאגר נתונים. במאמר זה, אנחנו נשתמש במאגר נתונים CIFAR-100. המאגר הזה דומה ל-CIFAR-10, אבל יש לו 100 מחלוקות שכוללות 600 תמונות בכל אחת. יש 500 תמונות מאמצים ו-100 תמונות בדיקה לכל מחלקה. ה-100 מחלקות ב-CIFAR-100 מקבצות ל-20 סופרקלassen. לכל תמונה יש תווית "פאין" (המחלקה שלה) ותווית "קוארס" (הסופרקלassen שלה). אנחנו נהגה בתווית "פאין" פה. הנה רשימת המחלקות ב-CIFAR-100:
רשימת המחלקות למאגר נתונים CIFAR-100
ייבאייטינג הספרים
אנחנו נעבד בעיקר עם torch
(משמש לבניית המודל ולהתאמה), torchvision
(לטעיית מידע, מכיל מאגרי נתונים ושיטות לעיבוד אותם בראיית-מכונה) ו numpy
(לעיבוד מתמטי). אנחנו גם נגדיר משתנה device
כך שהתוכנית תוכל להשתמש בGPU אם זה מוכן
טעינת הנתונים
torchvision
היא ספרייה שמעבירה גישה קלה לעשרות מאגרי נתונים עין-מכשיריים ושיטות למעדכנת הנתונים בדרך קלה ואינטואיבית
- אנחנו מגדירים פונקציית
data_loader
שמחזירה את הנתונים המתאמים עם התרגילים או הנתונים הבדיקה בהתאמה לאגודלים שלהם - אנחנו מתחילים בהגדרת המשתנה
normalize
עם הממוצעים וההתדירויות של כל ערוץ (אדום, ירוק וכחול) בנתונים. אלה יכולים להיות מוחשים באופן ידני, אבל נמצאים גם ברשת. זה משמש במשתנהtransform
בו אנחנו מגדילים את הנתונים, מועברים אותם לטנסורים ואז מונילים אותם - אם האגודל
test
הוא אמת, אנחנו פשוט מטעינים את החלק הבדיקה של הנתונים ומחזירים אותו באמצעות טעינות נתונים (הסבר נמצא למטה) - במקרה בו
test
הוא לא אמת (ההתנהגות הבסיסית), אנחנו מטעינים את החלק האמון של הנתונים ומפרקים אותו אקראית למען האמון והבדיקה (0.9:0.1) - לבסוף, אנחנו משתמשים בטעינות נתונים. זה עלול להשפיע לא על הביצועים במקרה של נתונים קטנים כמו CIFAR100, אבל הוא יכול בהדרגה להשפיע על הביצועים במקרה של נתונים גדולים והוא בדרך כלל נחשב כמנהג טוב. טעינות נתונים מאפשרות לנו לחד
VGG16 מתחילה
כדי לבנות מודל מתחילה, עלינו להבין קודם איך הגדרות מודל פועלות בtorch
והסוגים השונים של שכבות שנשתמש בהן כאן:
- כל מודל מותאם צריך להוריד ממשך מהמערכת
nn.Module
בגלל שהיא מעניקה פונקציות בסיסיות שעוזרות למודל להתאמן. - שנית, יש שנעשה שני דברים עיקריים. ראשית, להגדיר את השכבות השונות של המודל שלנו בתוך פונקציית
__init__
ואת הסדרה בה השכבות האלה ייבצעו על הקלט בתוך הפונקצייתforward
בואו נהגדיר עכשיו את הסוגים השונים של השכבות שאנחנו משתמשים כאן:
nn.Conv2d
: אלה הם השכבות המערך המקלטים שמקבלות מספרים של ערוצי קלט ויוצאה את הערוצים המקבלים בעזרת סדרה של פילטרים. היא גם מקבלת שדות אופציות או המרופדים אם רוצים ליישם אותםnn.BatchNorm2d
: זה מיישם את הטיפול בסינון הציונים על היוצאה של שכבת המערךnn.ReLU
: זוהי הפעלה המושבעת שישומה ליוצאות מהרשת.nn.MaxPool2d
: זה ייישם מיקס פוליינג על הייצוא עם גודל של קלט נתון.nn.Dropout
: זה משמש ליישם דרפואת על הייצוא עם סיכוי נתון.nn.Linear
: זה בעיקרון שכבה מחוברת לחלוטין.nn.Sequential
: זה לא סוג של שכבה אך עוזר לשלבים שונים שחלקים מאותו שלב.
בעזרת הידע הזה, אנחנו יכולים עכשיו לבנות את המודל VGG16 בעזרת הארכיטקטורה שבעיתון:
VGG16 מתחילה
היפרפרמטרים
חלק חשוב מבין הפרויקטים של המכונה או הלמידה עמוקה הוא לאופטימיze את ההיפרפרמטרים. פה, אנחנו לא ננסה עם ערכים שונים לאלה אך נצטרך להגדיר אותם לפני כן. אלה כוללים הגדרת מספר המבטאים, גודל הערימות, שיעור הלמידה, פונקציית האובדן ביחד עם האופטימיzer.
הגדרת ההיפרפרמטרים
אימון
אנחנו מוכנים לאתרחן את המודל שלנו. נתחיל בהסתכלות על הדרך בה אנחנו מאתרחנים את המודל שלנו ב- torch
ואז נביט בקוד:
- לכל אקופה, אנחנו עוברים על התמונות והתוויות בתוך
train_loader
שלנו ומביאים את התמונות והתוויות ל-GPU אם זמין. זה קורה אוטומטית - אנחנו משתמשים במודל שלנו כדי לחזות על התוויות (
model(images)
) ואז מחשבים את האובדן בין החיזויים והתוויות האמיתיות באמצעות פונקציית האובדן שלנו (criterion(outputs, labels)
) - אז אנחנו משתמשים באובדן הזה כדי לבצע בקפרופוגרציה (
loss.backward
) ולעדכן את המשקלים (optimizer.step()
). אבל תזכרו להכניס את המדרגות לאפס לפני כל עדכון. זה נעשה באמצעותoptimizer.zero_grad()
- בנוסף, בסוף כל אקופה אנחנו משתמשים בקבוצת האימון שלנו כדי לחשב את הדיוק של המודל גם כן. במקרה הזה, אין צורך במדרגות כך שאנחנו משתמשים ב-
with torch.no_grad()
עבור בדיקה מהירה
עכשיו, אנחנו משלבים את כל זה לתוך הקוד הבא:
אימון
ניתן לראות את הפלט של הקוד הנתון להלן שמראה שהמודל באמת לומד ככל שהאובדן יורד עם כל אקופה:
אובדנות האימ
בדיקה
לבדיקה, אנחנו משתמשים בקוד המדוייק בדיוק כמו באימות אבל עם test_loader
:
בדיקה
בעזרת הקוד העליון ועל-ידי הכשרת המודל ל-20 מבחנים, הצלחנו להשיג דיוק של 75% על המבחן.
הסיכוי
אז בואו נסיק את מה שעשינו במאמר הזה:
- התחלנו על-ידי הבנה של הארכיטקטורה וסוגים שונים של שכבות במודל VGG-16
- בהמשך, העלינו ועיבדנו את הנתונים CIFAR100 בעזרת
torchvision
- אחר כך, השתמשנו ב
PyTorch
כדי לבנות את המודל VGG-16 מדגימה בעזרת הבנה של סוגים שונים של שכבות הזמינים בtorch
- סוף סוף, הכשרנו ובדיקנו את המודל שלנו על הנתונים CIFAR100, והמודל הזה נראה שולט במבחן הבדיקה עם דיוק של 75%
עבודה עתידית
בעזרת המאמר הזה, מקבלים הקדמה טובה ולמידה ידנית אבל תלמדו הרבה יותר אם תהרגשו את זה ותרצו לראות מה אפשר לעשות אחרת:
- אתה יכול לנסות להשתמש במערכות מידע שונות. אחת המערכות האלה היא CIFAR10 או חלק ממערכת ImageNet.
- ניתן לבצע ניסויים עם היפרפרמטרים שונים ולראות את השילוב הטוב ביותר שלהם עבור המודל.
- לבסוף, ניתן לנסות להוסיף או להסיר שכבות מהמערך כדי לראות את ההשפעה שלהן על היכולת של המודל. טוב יותר, ניסוי לבנות גירסה VGG-19 של המודל הזה.
Source:
https://www.digitalocean.com/community/tutorials/vgg-from-scratch-pytorch