המרת מערך נתונים של סיווג תמונות לשימוש עם Cloud TPU
במדריך הזה מוסבר איך להשתמש בסקריפט image classification data converter sample כדי להמיר מערך נתונים גולמי של סיווג תמונות לפורמט TFRecord שמשמש לאימון מודלים של Cloud TPU.
קובצי TFRecord מאפשרים לקרוא קבצים גדולים מ-Cloud Storage בצורה יעילה יותר מאשר לקרוא כל תמונה כקובץ נפרד. אפשר להשתמש ב-TFRecord בכל מקום שבו משתמשים בצינור (pipeline) של tf.data.Dataset.
מידע נוסף על השימוש ב-TFRecord זמין במאמרי TensorFlow הבאים:
- TFRecord ו-tf.train.Example
- tf.data.Dataset
- tf.data: בניית פייפליינים של קלט ב-TensorFlow
- PyTorch TFRecord reader and writer
אם אתם משתמשים ב-PyTorch או ב-JAX ולא ב-Cloud Storage לאחסון מערך הנתונים, יכול להיות שלא תיהנו מאותם יתרונות של TFRecords.
סקירה כללית של המרות
התיקייה image classification (סיווג תמונות) במאגר של כלי להמרת נתונים ב-GitHub מכילה את הסקריפט converter, את image_classification_data.py ואת הטמעה לדוגמה simple_example.py שאפשר להעתיק ולשנות כדי לבצע המרת נתונים משלכם.
בדוגמה של ממיר נתוני סיווג התמונות מוגדרות שתי מחלקות, ImageClassificationConfig ו-ImageClassificationBuilder. הכיתות האלה מוגדרות ב-tpu/tools/data_converter/image_classification_data.py.
ImageClassificationConfig היא מחלקה בסיסית מופשטת. מגדירים מחלקת משנה (subclass) של ImageClassificationConfig כדי להגדיר את ההגדרה שנדרשת ליצירת מופע של ImageClassificationBuilder.
ImageClassificationBuilder הוא כלי ליצירת מערכי נתונים של TensorFlow לסיווג של מערכי נתונים של תמונות. זו מחלקה משנית של tdfs.core.GeneratorBasedBuilder.
הוא מאחזר דוגמאות נתונים ממערך הנתונים וממיר אותן ל-TFRecords. קובצי TFRecord נכתבים לנתיב שצוין על ידי הפרמטר data_dir של המתודה __init__ של ImageClassificationBuilder.
ב-simple_example.py, מחלקת המשנה SimpleDatasetConfig ImageClassificationConfig מיישמת מאפיינים שמגדירים את המצבים הנתמכים, את מספר סוגי התמונות ואת מחולל הדוגמאות שמחזיר מילון שמכיל נתוני תמונה וסוג תמונה לכל דוגמה במערך הנתונים.
הפונקציה main() יוצרת מערך נתונים של נתוני תמונה שנוצרו באופן אקראי ומבצעת יצירה של אובייקט SimpleDatasetConfig, תוך ציון מספר הסיווגים והנתיב למערך הנתונים בדיסק. לאחר מכן, main() יוצר מופע של אובייקט ImageClassificationBuilder, ומעביר את המופע SimpleDatasetConfig. ולסיום, main() שיחות download_and_prepare(). כשקוראים לשיטה הזו, מופע ImageClassificationBuilder משתמש בגנרטור של דוגמאות נתונים שהוטמע על ידי SimpleDatasetConfig כדי לטעון כל דוגמה, ושומר אותן בסדרה של קובצי TFRecord.
הסבר מפורט יותר זמין במחברת Classification Converter.
שינוי הדוגמה להמרת נתונים כדי לטעון את מערך הנתונים
כדי להמיר את מערך הנתונים לפורמט TFRecord, צריך ליצור מחלקת משנה של
ImageClassificationConfig ולהגדיר את המאפיינים הבאים:
-
num_labels: מחזירה את מספר סיווגי התמונות -
supported_modes: מחזירה רשימה של מצבים שנתמכים על ידי מערך הנתונים שלכם (לדוגמה: test, train, validate) -
text_label_map: מחזירה מילון שממפה בין תווית של מחלקת טקסט לבין תווית של מחלקת מספרים שלמים (SimpleDatasetConfigלא משתמשת במאפיין הזה, כי היא לא דורשת מיפוי) -
download_path: הנתיב שממנו צריך להוריד את מערך הנתונים (SimpleDatasetConfigלא משתמש במאפיין הזה, example_generator()טוען את הנתונים מהדיסק)
מטמיעים את פונקציית הגנרטור example_generator(). השיטה הזו צריכה להחזיר מילון שמכיל את נתוני התמונה ואת שם סיווג התמונה לכל דוגמה.
הפונקציה ImageClassificationBuilder משתמשת בפונקציה example_generator() כדי לאחזר כל דוגמה ולכתוב אותה לדיסק בפורמט TFRecord.
הפעלת דוגמה להמרת נתונים
יוצרים קטגוריה של Cloud Storage באמצעות הפקודה הבאה:
gcloud storage buckets create gs://BUCKET_NAME --project=PROJECT_ID --location=LOCATION
מחליפים את מה שכתוב בשדות הבאים:
- BUCKET_NAME: שם לקטגוריה.
- PROJECT_ID: מזהה הפרויקט.
- LOCATION: המיקום שבו תיצור הקטגוריה. לדוגמה,
US-CENTRAL1.
יוצרים Cloud TPU באמצעות הפקודה
gcloud compute instances create.$ gcloud compute instances create TPU_NAME \ --machine-type=MACHINE_TYPE \ --zone=ZONE \ --image-family=IMAGE_FAMILY \ --image-project=IMAGE_PROJECT \ --maintenance-policy=TERMINATE
מחליפים את מה שכתוב בשדות הבאים:
- TPU_NAME: שם ל-TPU.
- MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש עבור TPU VM. מידע נוסף זמין במאמר בנושא סוגי מכונות TPU.
- ZONE: האזור שבו ייווצר ה-TPU.
- IMAGE_FAMILY: משפחת התמונות של תמונת מערכת ההפעלה שרוצים להשתמש בה. תשמש התמונה העדכנית ביותר שמשויכת למשפחה הזו ושלא הוצאה משימוש. כדי לציין תמונה ספציפית, מחליפים את הדגל
--image-familyבדגל--imageומגדירים את הערך שלו לתמונה של מערכת הפעלה נתמכת. רשימה של מערכות הפעלה נתמכות זמינה במאמר תמונות של מערכות הפעלה של TPU. - IMAGE_PROJECT: מזהה הפרויקט של תמונת מערכת ההפעלה. רשימה של מזהי פרויקטים שמשויכים לכל תמונה ציבורית זמינה במאמר בנושא תמונות של מערכת הפעלה של TPU.
מתחברים ל-TPU באמצעות SSH:
$ gcloud compute ssh TPU_NAME --zone=ZONE
כשמתחברים ל-TPU, שורת הפקודה של המעטפת משתנה מ-
username@projectnameל-username@vm-name.מתקינים את החבילות הנדרשות.
(vm)$ pip3 install opencv-python-headless pillow (vm)$ pip3 install tensorflow-datasets
יוצרים את משתני הסביבה הבאים שבהם הסקריפט משתמש.
(vm)$ export STORAGE_BUCKET=gs://BUCKET_NAME (vm)$ export CONVERTED_DIR=$HOME/tfrecords (vm)$ export GENERATED_DATA=$HOME/data (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
מורידים את מאגר TensorFlow TPU.
(vm)$ cd /usr/share/ (vm)$ git clone https://github.com/tensorflow/tpu.git (vm)$ cd tpu/tools/data_converter
הפעלת כלי להמרת נתונים במערך נתונים פיקטיבי
סקריפט simple_example.py נמצא בתיקייה simple_example.py של דוגמת ממיר הנתונים.image_classification הפעלת הסקריפט עם הפרמטרים הבאים יוצרת קבוצה של תמונות מזויפות וממירה אותן ל-TFRecords.
(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GENERATED_DATA \ --generate=True \ --num_examples_per_class_low=10 \ --num_examples_per_class_high=11 \ --save_dir=$CONVERTED_DIR
הפעלת כלי להמרת נתונים באחד ממערכי הנתונים הגולמיים שלנו
יוצרים משתנה סביבה למיקום של הנתונים הגולמיים.
(vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
מריצים את הסקריפט
simple_example.py.(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GCS_RAW \ --generate=False \ --save_dir=$CONVERTED_DIR
הסקריפט simple_example.py מקבל את הפרמטרים הבאים:
-
num_classesמתייחס למספר הכיתות במערך הנתונים. אנחנו משתמשים כאן ב-1000 כדי להתאים לפורמט ImageNet. -
generateקובע אם ליצור את הנתונים הגולמיים. -
data_pathמתייחס לנתיב שבו הנתונים נוצרים אםgenerate=True, או לנתיב שבו הנתונים הגולמיים מאוחסנים אםgenerate=False. - ההגדרות
num_examples_per_class_lowו-num_examples_per_class_highקובעות כמה דוגמאות ייווצרו לכל כיתה. הסקריפט יוצר מספר אקראי של דוגמאות בטווח הזה. -
save_dirמתייחס למיקום שבו נשמרים קובצי ה-TFRecord. כדי לאמן מודל ב-Cloud TPU, הנתונים צריכים להיות מאוחסנים ב-Cloud Storage. זה יכול להיות ב-Cloud Storage או במכונה הווירטואלית.
שינוי השם של קובצי TFRecord והעברה שלהם ל-Cloud Storage
בדוגמה הבאה נעשה שימוש בנתונים שהומרו עם מודל ResNet.
משנים את השם של קובצי TFRecord לאותו פורמט כמו קובצי TFRecord של ImageNet:
(vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/ (vm)$ sudo apt update (vm)$ sudo apt install rename
(vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
מעתיקים את קובצי ה-TFRecord ל-Cloud Storage:
(vm)$ gcloud storage cp train* $GCS_CONVERTED (vm)$ gcloud storage cp validation* $GCS_CONVERTED
הסרת המשאבים
מתנתקים מ-Cloud TPU, אם עדיין לא עשיתם זאת:
(vm)$ exit
ההנחיה אמורה להיות עכשיו
user@projectname, מה שמראה שאתם ב-Cloud Shell.ב-Cloud Shell, מריצים את הפקודה
gcloud compute instances deleteכדי למחוק את מכונת ה-VM של TPU.$ gcloud compute instances delete TPU_NAME \ --zone=ZONE
מריצים את הפקודה
gcloud compute instances listכדי לוודא שה-VM נמחק. יכול להיות שתהליך המחיקה יימשך כמה דקות.$ gcloud compute instances list --zone=ZONE
כדי למחוק את הקטגוריה, מריצים את הפקודה הבאה ומחליפים את BUCKET_NAME בשם הקטגוריה שיצרתם במדריך הזה:
$ gcloud storage rm gs://BUCKET_NAME --recursive