כיצד ליישם CNN באמצעות Deeplearning4j

1. סקירה כללית

במדריך זה, אנו לבנות ולהכשיר רשת עצבית מתפתחת מודל באמצעות ספריית Deeplearning4j בג'אווה.

למידע נוסף על אופן הקמת הספרייה עיין במדריך שלנו בנושא Deeplearning4j.

2. סיווג תמונות

2.1. הצהרת בעיה

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

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

2.2. ייצוג תמונה

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

תמונה בגווני אפור היא מטריצה ​​דו ממדית. באופן דומה, תמונת ה- RGB היא מטריצה ​​תלת ממדית עם ממדי רוחב, גובה ועומק.

כפי שאנו רואים, התמונה היא קבוצת מספרים. לכן, אנו יכולים לבנות מודלים מרובי שכבות כדי לאמן אותם לסווג תמונות.

3. רשתות עצביות מתפתחות

רשת עצבית קונבנציונאלית (CNN) היא מודל רשת רב שכבתי בעל מבנה ספציפי. מבנה ה- CNN יכול להיות מחולק לשני בלוקים: שכבות התפתחות ושכבות מחוברות (או צפופות) במלואן. בואו נסתכל על כל אחד מהם.

3.1. שכבה מתפתלת

כל אחד שכבת קונבולוציה היא קבוצה של מטריצות מרובעות, הנקראות גרעינים. מעל לכל, אנו זקוקים להם לביצוע התמוטטות על תמונת הקלט. כמותם וגודלם עשויים להשתנות, תלוי במערך הנתונים הנתון. אנו משתמשים בעיקר בגרעינים 3 × 3 או 5 × 5, ולעיתים נדירות 7 × 7. הגודל והסכום המדויקים נבחרים על ידי ניסוי וטעייה.

בנוסף, אנו בוחרים באופן אקראי את המשתנים של מטריצות הליבה בתחילת הרכבת. הם משקולות הרשת.

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

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

3.2. שכבת דגימת משנה

שכבת הדגימה המשנה (או הבריכה) היא שכבה של הרשת, המשמשת בדרך כלל לאחר השכבה. לאחר הקונבולוציה, אנו מקבלים הרבה משתנים מחושבים. עם זאת, המשימה שלנו היא לבחור את היקר ביותר מביניהם.

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

3.3. שכבה צפופה

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

הפלט של הרשת הוא ההסתברות שהתמונה שייכת לכל אחת מהמחלקות. כדי לחזות את ההסתברויות, נשתמש בפונקציית ההפעלה של Softmax.

3.4. טכניקות אופטימיזציה

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

כשאנחנו מעבירים תמונה לרשת, זה נותן לנו את התשובה. ואז, אנו עשויים בנה פונקציית הפסד, שתלוי בתשובה זו. מבחינת למידה מפוקחת, יש לנו גם תשובה ממשית - הכיתה האמיתית. שֶׁלָנוּ המשימה היא למזער את פונקציית האובדן הזו. אם נצליח, המודל שלנו מאומן היטב.

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

אנו עשויים להגדיל או להקטין את ערך המשקל כדי למצוא את המינימום המקומי של פונקציית ההפסד מכיוון שאנו מכירים את השיפוע. יתר על כך, התהליך הזה הוא איטרטיבי ומכונה Gradient Descent. Backpropagation משתמש בירידת שיפוע כדי להפיץ את עדכון המשקל מהסוף להתחלת הרשת.

במדריך זה נשתמש באלגוריתם האופטימיזציה של Stochastic Gradient Decent (SGD). הרעיון העיקרי הוא שאנחנו בוחרים באופן אקראי את סדרת תמונות הרכבת בכל שלב. ואז אנו מיישמים צמיחת גב.

3.5. מדדי הערכה

לבסוף, לאחר הכשרת הרשת, עלינו לקבל מידע על ביצועי הביצועים של המודל שלנו.

המדד המשמש בעיקר הוא דיוק. זהו היחס בין תמונות המסווגות כהלכה לבין כל התמונות. בינתיים, זיכרון, דיוק וציון F1 הם מדדים חשובים מאוד לסיווג תמונות גם כן.

4. הכנת מערך נתונים

בחלק זה נכין את התמונות. בוא נשתמש במערך הנתונים CIFAR10 המוטבע במדריך זה. אנו ניצור איטרורים לגישה לתמונות:

מחלקה ציבורית CifarDatasetService מיישמת את IDataSetService {פרטי CifarDataSetIterator trainIterator; פרטי CifarDataSetIterator testIterator; ציבור CifarDatasetService () {trainIterator = חדש CifarDataSetIterator (trainBatch, trainImagesNum, נכון); testIterator = CifarDataSetIterator חדש (testBatch, testImagesNum, false); } // הצהרת שיטות ושדות אחרים}

אנו יכולים לבחור כמה פרמטרים בעצמנו. TrainBatch ו testBatch הם מספר התמונות ברכבת ושלב הערכה בהתאמה. TrainImagesNum ו testImagesNum הם מספר התמונות לאימון ובדיקה. תקופה אחת נמשכת trainImagesNum / trainBatch צעדים. לכן, לאחר 2048 תמונות רכבת עם גודל אצווה = 32 תוביל 2048/32 = 64 צעדים בעידן אחד.

5. רשת עצבית קונוובולוציונית ב- Deeplearning4j

5.1. בניית המודל

לאחר מכן, בואו נבנה את דגם ה- CNN שלנו מאפס. לעשות זאת, נשתמש בשכבות סיבוביות, תת-דגימה (איגום) ומחוברות באופן מלא (צפוף).

תצורת MultiLayerConfiguration = NeuralNetConfiguration.Builder חדש () .זרע (1611) .optimizationAlgo (OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .learningRate (מאפיינים.getLearningRate ()). Regularization (נכון). (0, conv5x5 ()). שכבה (1, pooling2x2Stride2 ()). שכבה (2, conv3x3Stride1Padding2 ()). שכבה (3, pooling2x2Stride1 ()). שכבה (4, conv3x3Stride1Padding1 ()). שכבה (5, pool2 )). שכבה (6, צפוף ()). pretrain (false). backprop (true) .setInputType (dataSetService.inputType ()) .build (); רשת = MultiLayerNetwork חדש (תצורה);

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

5.2. הכשרת המודל

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

רכבת חלל ציבורית () {network.init (); IntStream.range (1, epochsNum + 1) .forEach (epoch -> {network.fit (dataSetService.trainIterator ());}); }

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

5.3. הערכת המודל

לבסוף, אנו יכולים להעריך את המודל שהוכשר כעת. ספריית Deeplearning4j מספקת יכולת לעשות זאת בקלות:

הערכה ציבורית הערכה () {return network.evaluate (dataSetService.testIterator ()); }

הַעֲרָכָה הוא אובייקט, המכיל מדדים מחושבים לאחר אימון המודל. אלה הם דיוק, דיוק, זיכרון וציון F1. יתר על כן, יש לו ממשק ידידותי להדפסה:

=========================== ציונים ======================== כיתות: 11 דיוק: 0,8406 דיוק: 0,7303 זיכרון: 0,6820 ציון F1: 0,6466 ============================ =============================

6. מסקנה

במדריך זה למדנו על הארכיטקטורה של מודלי CNN, טכניקות אופטימיזציה ומדדי הערכה. יתר על כן, יישמנו את המודל באמצעות ספריית Deeplearning4j בג'אווה.

כרגיל, קוד לדוגמא זו זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found