מנע התאמת יתר והגבר את הדיוק של מודל למידת המכונה שלך על ידי יישום שיטות הגדלת הנתונים של TensorFlow.
הגדלת נתונים היא תהליך של החלת טרנספורמציות שונות על נתוני האימון. זה עוזר להגדיל את הגיוון של מערך הנתונים ולמנוע התאמה יתר. התאמת יתר מתרחשת בעיקר כאשר יש לך נתונים מוגבלים לאימון הדגם שלך.
כאן תלמד כיצד להשתמש במודול הגדלת הנתונים של TensorFlow כדי לגוון את מערך הנתונים שלך. זה ימנע התאמת יתר על ידי יצירת נקודות נתונים חדשות השונות מעט מהנתונים המקוריים.
ערכת הנתונים לדוגמה שבה תשתמש
אתה תשתמש במערך הנתונים של חתולים וכלבים קגל. מערך נתונים זה מכיל כ-3,000 תמונות של חתולים וכלבים. תמונות אלו מחולקות לקבוצות הדרכה, בדיקות ואימות.
התווית 1.0 מייצגת כלב ואילו התווית 0.0 מייצגת חתול.
קוד המקור המלא המיישם טכניקות הגדלת נתונים וזה שלא זמין ב-a מאגר GitHub.
התקנה וייבוא של TensorFlow
כדי להמשיך, אתה צריך להיות א הבנה בסיסית של Python. אתה צריך גם ידע בסיסי בלמידת מכונה. אם אתה זקוק לרענון, מומלץ לשקול לעקוב אחר כמה מדריכים על למידת מכונה.
לִפְתוֹחַ גוגל קולאב. שנה את סוג זמן הריצה ל-GPU. לאחר מכן, בצע את פקודת הקסם הבאה בתא הקוד הראשון כדי להתקין את TensorFlow בסביבה שלך.
!pip התקנת tensorflow
יבא את TensorFlow ואת המודולים והמחלקות הרלוונטיים שלו.
יְבוּא זרימת טנסור כפי ש tf
מ tensorflow.keras.preprocessing.image יְבוּא ImageDataGenerator
מ tensorflow.keras.models יְבוּא סִדרָתִי
מ tensorflow.keras.layers יְבוּא Conv2D, MaxPooling2D, Flatten, Dense, Dropout
ה tensorflow.keras.preprocessing.image יאפשר לך לבצע הגדלת נתונים במערך הנתונים שלך.
יצירת מופעים של מחלקת ImageDataGenerator
צור מופע של ה ImageDataGenerator מחלקה לנתוני הרכבת. אתה תשתמש באובייקט זה לעיבוד מקדים של נתוני האימון. זה יפיק קבוצות של נתוני תמונה מוגדלים בזמן אמת במהלך אימון המודל.
במשימה של סיווג אם תמונה היא חתול או כלב, אתה יכול להשתמש בטכניקות היפוך, רוחב אקראי, גובה אקראי, בהירות אקראית והגדלת נתונים זום. טכניקות אלו ייצרו נתונים חדשים המכילים וריאציות של הנתונים המקוריים המייצגים תרחישים בעולם האמיתי.
# להגדיר את מחולל נתוני התמונה להדרכה
train_datagen = ImageDataGenerator (Rescale=1./255,
horizontal_flip=נָכוֹן,
width_shift_range=0.2,
height_shift_range=0.2,
טווח_בהירות=[0.2,1.0],
zoom_range=0.2)
צור מופע נוסף של ImageDataGenerator מחלקה עבור נתוני הבדיקה. אתה תצטרך את קנה מידה מחדש פָּרָמֶטֶר. זה ינרמל את ערכי הפיקסלים של תמונות המבחן כך שיתאימו לפורמט המשמש במהלך האימון.
# הגדר את מחולל נתוני התמונה לבדיקה
test_datagen = ImageDataGenerator (קנה מידה מחדש=1./255)
צור מופע אחרון של ImageDataGenerator מחלקה עבור נתוני האימות. קנה מידה מחדש של נתוני האימות באותו אופן כמו נתוני הבדיקה.
# הגדר את מחולל נתוני התמונה לאימות
validation_datagen = ImageDataGenerator (קנה מידה מחדש=1./255)
אינך צריך ליישם את טכניקות ההגדלה האחרות על נתוני הבדיקה והאימות. הסיבה לכך היא שהמודל משתמש בנתוני הבדיקה והאימות למטרות הערכה בלבד. הם צריכים לשקף את התפלגות הנתונים המקורית.
טוען את הנתונים שלך
ליצור DirectoryIterator אובייקט מספריית ההדרכה. זה יפיק קבוצות של תמונות מוגדלות. לאחר מכן ציין את הספרייה המאחסנת את נתוני ההדרכה. שנה את גודל התמונות לגודל קבוע של 64x64 פיקסלים. ציין את מספר התמונות שבהן כל אצווה תשתמש. לבסוף, ציין את סוג התווית בינארי (כלומר, חתול או כלב).
# הגדרת ספריית ההדרכה
train_data = train_datagen.flow_from_directory (ספרייה=r'/content/drive/MyDrive/cats_and_dogs_filtered/train',
target_size=(64, 64),
batch_size=32,
class_mode='בינארי')
צור אחר DirectoryIterator אובייקט מספריית הבדיקות. הגדר את הפרמטרים לאותם ערכים לאלו של נתוני האימון.
# הגדרת ספריית הבדיקות
test_data = test_datagen.flow_from_directory (ספרייה='/content/drive/MyDrive/cats_and_dogs_filtered/test',
target_size=(64, 64),
batch_size=32,
class_mode='בינארי')
צור גמר DirectoryIterator אובייקט מתוך ספריית האימות. הפרמטרים נשארים זהים לאלו של נתוני ההדרכה והבדיקות.
# מגדיר את ספריית האימות
validation_data = validation_datagen.flow_from_directory (ספרייה='/content/drive/MyDrive/cats_and_dogs_filtered/validation',
target_size=(64, 64),
batch_size=32,
class_mode='בינארי')
איטרטורי הספריות אינם מגדילים את מערכי האימות והבדיקה.
הגדרת הדגם שלך
הגדר את הארכיטקטורה של הרשת העצבית שלך. תשתמש ב רשת נוירונים מתגלגלת (CNN). CNNs נועדו לזהות דפוסים ותכונות בתמונות.
model = Sequential()
# שכבה מתפתלת עם 32 מסננים בגודל 3x3
model.add (Conv2D(32, (3, 3), הפעלה='רלו', input_shape=(64, 64, 3)))# שכבת בריכה מקסימלית עם גודל בריכה 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))# שכבה קונבולוציונית עם 64 מסננים בגודל 3x3
model.add (Conv2D(64, (3, 3), הפעלה='רלו'))# שכבת בריכה מקסימלית עם גודל בריכה 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))# לשטח את הפלט מהשכבות הקונבולוציוניות והאיגום
model.add (Flatten())# שכבה מחוברת במלואה עם 128 יחידות והפעלת ReLU
model.add (צפוף(128, הפעלה='רלו'))# עזוב באקראי 50% מהיחידות כדי למנוע התאמת יתר
model.add (נשירה(0.5))
# שכבת פלט עם הפעלת סיגמואיד (סיווג בינארי)
model.add (צפוף(1, הפעלה='סיגמואיד'))
הרכיב את המודל באמצעות הבינארי אנטרופיה צולבת פונקציית הפסד. בעיות סיווג בינארי משתמשות בו בדרך כלל. עבור האופטימיזציה, השתמש ב- אדם אופטימיזציה. זהו אלגוריתם אופטימיזציה של קצב למידה אדפטיבי. לבסוף, הערך את המודל במונחים של דיוק.
model.compile (loss='בינארי_קרוסנטרופיה', אופטימיזציה='אדם', מדדים=['דיוק'])
הדפס תקציר של ארכיטקטורת הדגם לקונסולה.
model.summary()
צילום המסך הבא מציג את ההדמיה של ארכיטקטורת המודל.
זה נותן לך סקירה כללית של איך נראה עיצוב הדגם שלך.
אימון הדגם שלך
אמן את הדגם באמצעות לְהַתְאִים() שיטה. הגדר את מספר הצעדים לעידן להיות מספר דגימות האימון חלקי גודל_אצווה. כמו כן, הגדר את נתוני האימות ואת מספר שלבי האימות.
# אימון המודל על נתוני האימון
history = model.fit (רכבת_נתונים,
steps_per_epoch=train_data.n // train_data.batch_size,
עידנים=50,
validation_data=validation_data,
validation_steps=validation_data.n // validation_data.batch_size)
ה ImageDataGenerator מחלקה מיישמת הגדלת נתונים על נתוני האימון בזמן אמת. זה הופך את תהליך האימון של המודל לאיטי יותר.
הערכת המודל שלך
הערך את הביצועים של המודל שלך על נתוני הבדיקה באמצעות ה להעריך() שיטה. כמו כן, הדפס את אובדן הבדיקה והדיוק לקונסולה.
test_loss, test_acc = model.evaluate (test_data,
steps=test_data.n // test_data.batch_size)
הדפס(f'הפסד במבחן: {test_loss}')
הדפס(דיוק הבדיקה: {test_acc}')
צילום המסך הבא מציג את ביצועי הדגם.
המודל מתפקד בצורה סבירה על נתונים שלא נראו מעולם.
כאשר אתה מפעיל קוד שאינו מיישם את טכניקות הגדלת הנתונים, דיוק אימון המודל הוא 1. מה שאומר שזה מתאים יותר מדי. הוא גם מציג ביצועים גרועים בנתונים שמעולם לא ראה בעבר. הסיבה לכך היא שהוא לומד את המוזרויות של מערך הנתונים.
מתי הגדלת נתונים לא מועילה?
- כאשר מערך הנתונים כבר מגוון וגדול: הגדלת נתונים מגדילה את הגודל והמגוון של מערך נתונים. אם מערך הנתונים כבר גדול ומגוון, הגדלת נתונים לא תהיה שימושית.
- כאשר מערך הנתונים קטן מדי: הגדלת נתונים לא יכולה ליצור תכונות חדשות שאינן קיימות במערך הנתונים המקורי. לכן, הוא לא יכול לפצות על מערך נתונים קטן חסר רוב התכונות שהמודל דורש ללמוד.
- כאשר סוג הגדלת הנתונים אינו הולם: לדוגמה, ייתכן שסיבוב תמונות לא יועיל כאשר כיוון האובייקטים חשוב.
למה TensorFlow מסוגל
TensorFlow היא ספרייה מגוונת ועוצמתית. הוא מסוגל לאמן מודלים מורכבים של למידה עמוקה ויכול לפעול על מגוון מכשירים מסמארטפונים ועד אשכולות שרתים. זה עזר להעצים התקני מחשוב המנצלים למידת מכונה.