1. לפני שמתחילים
ב-codelab הזה תבדקו קוד שנוצר באמצעות TensorFlow ו-TensorFlow Lite Model Maker כדי ליצור מודל באמצעות מערך נתונים שמבוסס על ספאם בתגובות. הנתונים המקוריים זמינים ב-Kaggle. הנתונים נאספו לקובץ CSV יחיד, ועברו ניקוי שכלל הסרה של טקסט פגום, תגי עיצוב, מילים שחוזרות על עצמן ועוד. כך יהיה קל יותר להתמקד במודל במקום בטקסט.
הקוד שאתם עומדים לבדוק מופיע כאן, אבל מומלץ מאוד לעקוב אחרי הקוד ב-Google Colab.
דרישות מוקדמות
- ה-Codelab הזה מיועד למפתחים מנוסים שחדשים בתחום של למידת מכונה.
- ה-codelab הזה הוא חלק מתוכנית הלימודים Get Started with Text Classification for Mobile (איך מתחילים לעבוד עם סיווג טקסט לנייד). אם עדיין לא השלמתם את הפעילויות הקודמות, עליכם להפסיק ולעשות זאת עכשיו.
מה תלמדו
- איך מתקינים את TensorFlow Lite Model Maker באמצעות Google Colab
- איך מורידים את הנתונים משרת הענן למכשיר
- איך משתמשים בכלי להעלאת נתונים
- איך בונים את המודל
הדרישות
- גישה אל Google Colab
2. התקנה של TensorFlow Lite Model Maker
פותחים את ה-Colab. בתא הראשון ב-Notebook יותקן TensorFLow Lite Model Maker:
!pip install -q tflite-model-maker
אחרי שהתהליך מסתיים, עוברים לתא הבא.
3. ייבוא הקוד
בתא הבא יש מספר ייבואים שהקוד במחברת יצטרך להשתמש בהם:
import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader
import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')
בנוסף, המערכת תבדוק אם אתם מריצים TensorFlow 2.x, שזו דרישה לשימוש ב-Model Maker.
4. הורדת הנתונים
לאחר מכן תורידו את הנתונים משרת הענן למכשיר שלכם, ותגדירו את data_file כך שיצביע על הקובץ המקומי:
data_file = tf.keras.utils.get_file(fname='comment-spam.csv',
origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv',
extract=False)
ב-Model Maker אפשר לאמן מודלים מקובצי CSV פשוטים כמו זה. צריך רק לציין באילו עמודות נמצא הטקסט ובאילו עמודות נמצאות התוויות. בהמשך ה-codelab נסביר איך עושים את זה.
5. הטמעות שנלמדו מראש
בדרך כלל, כשמשתמשים ב-Model Maker, לא יוצרים מודלים מאפס. אתם משתמשים במודלים קיימים שאתם מתאימים לצרכים שלכם.
במודלים של שפה, כמו זה, התהליך כולל שימוש בהטמעות שנלמדו מראש. הרעיון מאחורי הטמעה הוא שהמילים מומרות למספרים, וכל מילה במאגר המילים הכולל מקבלת מספר. הטמעה היא וקטור שמשמש לקביעת הסנטימנט של המילה על ידי יצירת 'כיוון' למילה. לדוגמה, מילים שמופיעות לעיתים קרובות בהודעות ספאם בתגובות יצביעו על וקטורים בכיוון דומה, ומילים שלא מופיעות בהן יצביעו על וקטורים בכיוון ההפוך.
כשמשתמשים בהטמעות שנלמדו מראש, אפשר להתחיל עם קורפוס, או אוסף, של מילים שכבר נלמדו מהן רגשות מתוך גוף טקסט גדול. כך תוכלו למצוא פתרון הרבה יותר מהר מאשר אם תתחילו מאפס.
ב-Model Maker יש כמה הטמעות שכבר נלמדו שאפשר להשתמש בהן, אבל הכי פשוט ומהיר להתחיל עם average_word_vec.
זה הקוד:
spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7
הפרמטר num_words
תצטרכו גם לציין את מספר המילים שבהן אתם רוצים שהמודל ישתמש.
אולי תחשבו שככל שיש יותר מילות מפתח, כך יותר טוב, אבל בדרך כלל יש מספר נכון של מילות מפתח בהתאם לתדירות השימוש בכל מילה. אם משתמשים בכל מילה במאגר המידע כולו, יכול להיות שהמודל ינסה ללמוד ולקבוע את הכיוון של מילים שמשמשות רק פעם אחת. בכל קורפוס טקסט אפשר למצוא הרבה מילים שמשמשות רק פעם אחת או פעמיים, ובדרך כלל לא כדאי להשתמש בהן במודל כי ההשפעה שלהן על הסנטימנט הכולל זניחה. אפשר לכוונן את המודל לפי מספר המילים הרצוי באמצעות הפרמטר num_words.
מספר קטן יותר כאן עשוי להניב מודל קטן ומהיר יותר, אבל הוא עשוי להיות פחות מדויק, כי הוא מזהה פחות מילים. מספר גדול יותר כאן יגרום ליצירת מודל גדול יותר ואיטי יותר. חשוב למצוא את שביל הזהב!
הפרמטר wordvec_dim
הפרמטר wordved_dim הוא מספר המאפיינים שרוצים להשתמש בהם עבור הווקטור של כל מילה. כלל האצבע שנקבע על סמך המחקר הוא השורש הרביעי של מספר המילים. לדוגמה, אם אתם משתמשים ב-2,000 מילים, נקודת התחלה טובה היא 7. אם משנים את מספר המילים, אפשר לשנות גם את זה.
הפרמטר seq_len
בדרך כלל, המודלים מאוד נוקשים בכל מה שקשור לערכי הקלט. במקרה של מודל שפה, המשמעות היא שמודל השפה יכול לסווג משפטים באורך מסוים וקבוע. הערך הזה נקבע על ידי הפרמטר seq_len, או אורך הרצף.
כשממירים מילים למספרים (או לטוקנים), משפט הופך לרצף של הטוקנים האלה. לכן המודל יאומן (במקרה הזה) לסווג ולזהות משפטים שמכילים 20 טוקנים. אם המשפט ארוך יותר, הוא ייקטע. אם הוא קצר יותר, הוא ירופד. במאגר המידע יופיע טוקן ייעודי <PAD> שישמש למטרה הזו.
6. שימוש ברכיב טעינה של נתונים
קודם הורדתם את קובץ ה-CSV. עכשיו צריך להשתמש בכלי לטעינת נתונים כדי להפוך את זה לנתוני אימון שהמודל יכול לזהות:
data = DataLoader.from_csv(
filename=data_file,
text_column='commenttext',
label_column='spam',
model_spec=spec,
delimiter=',',
shuffle=True,
is_training=True)
train_data, test_data = data.split(0.9)
אם פותחים את קובץ ה-CSV בעורך, רואים שבכל שורה יש רק שני ערכים, והם מתוארים באמצעות טקסט בשורה הראשונה של הקובץ. בדרך כלל, כל רשומה נחשבת לעמודה.
תוכלו לראות שהתיאור של העמודה הראשונה הוא commenttext, והערך הראשון בכל שורה הוא הטקסט של התגובה. באופן דומה, התיאור של העמודה השנייה הוא spam, ואפשר לראות שהערך השני בכל שורה הוא True או False,, כדי לציין אם הטקסט הזה נחשב לתגובת ספאם או לא. המאפיינים האחרים מגדירים את model_spec שיצרתם קודם, יחד עם תו מפריד, שבמקרה הזה הוא פסיק כי הקובץ מופרד בפסיקים. תשתמשו בנתונים האלה לאימון המודל, ולכן הערך של is_Training הוא True.
כדאי להחריג חלק מהנתונים כדי לבדוק את המודל. מפצלים את הנתונים, כך ש-90% מהם ישמשו לאימון ו-10% לבדיקה או להערכה. כדי לוודא שנתוני הבדיקה נבחרו באופן אקראי ולא מתוך 10% הנתונים 'התחתונים' במערך הנתונים, משתמשים ב-shuffle=True כשמעלים את הנתונים כדי להקצות אותם באופן אקראי.
7. יצירת המודל
התא הבא הוא פשוט כדי לבנות את המודל, וזו שורה אחת של קוד:
# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
validation_data=test_data)
הפעולה הזו יוצרת מודל לסיווג טקסט באמצעות Model Maker, ואתם מציינים את נתוני האימון שבהם אתם רוצים להשתמש (כפי שהוגדר בשלב 4), את מפרט המודל (כפי שהוגדר בשלב 4) ומספר תקופות האימון, במקרה הזה 50.
העיקרון הבסיסי של למידת מכונה הוא שזו צורה של התאמת תבניות. בתחילה, המודל יטען את המשקלים שאומנו מראש עבור המילים, וינסה לקבץ אותן יחד עם חיזוי של אילו מילים, כשהן מקובצות יחד, מצביעות על ספאם, ואילו לא. בפעם הראשונה, סביר להניח שהיחס יהיה קרוב ל-50:50, כי המודל רק מתחיל.

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

עד שתגיעו לאפוקה ה-50, המודל ידווח על רמת דיוק גבוהה בהרבה. במקרה הזה, 99%!
בצד שמאל יופיעו נתוני הדיוק של האימות. בדרך כלל, הערכים האלה יהיו קצת יותר נמוכים מאשר דיוק האימון, כי הם מציינים איך המודל מסווג נתונים שהוא לא'ראה' בעבר. היא משתמשת ב-10% מנתוני הבדיקה שהשארנו בצד קודם.

8. ייצוא המודל
אחרי שמסיימים את האימון, אפשר לייצא את המודל.
TensorFlow מאמן מודל בפורמט משלו, וצריך להמיר אותו לפורמט TFLITE כדי להשתמש בו באפליקציה לנייד. Model Maker מטפל במורכבות הזו בשבילכם.
פשוט מייצאים את המודל ומציינים ספרייה:
model.export(export_dir='/mm_spam')
בספרייה הזו יופיע קובץ model.tflite. מורידים אותו תצטרכו אותו ב-codelab הבא, שבו תוסיפו אותו לאפליקציית Android שלכם.
הערות לגבי iOS
מודל .tflite שייצאתם עכשיו מתאים ל-Android, כי מוטמעים בו מטא-נתונים על המודל, ו-Android Studio יכול לקרוא את המטא-נתונים האלה.
הנתונים האלה חשובים מאוד כי הם כוללים מילון של טוקנים שמייצגים מילים כפי שהמודל מזהה אותן. זוכרים שקראתם קודם שמילים הופכות לאסימונים, ולאסימונים האלה מוקצים וקטורים לניתוח הסנטימנט? האפליקציה לנייד צריכה לדעת את הטוקנים האלה. לדוגמה, אם המילה dog (כלב) עברה טוקניזציה ל-42, והמשתמשים מקלידים את המילה dog במשפט, האפליקציה תצטרך להמיר את המילה dog ל-42 כדי שהמודל יבין אותה. מפתחי Android יכולים להשתמש בספריית המשימות של TensorFlow Lite, שמקלה על השימוש ב-API הזה, אבל ב-iOS צריך לעבד את אוצר המילים, ולכן צריך שהוא יהיה זמין. כדי לייצא את זה באמצעות Model Maker, צריך לציין את הפרמטר export_format. לכן, כדי לקבל את התוויות ואת אוצר המילים של המודל, אפשר להשתמש בפקודה הבאה:
model.export(export_dir='/mm_spam/',
export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])
9. מזל טוב
ב-Codelab הזה למדתם איך ליצור ולייצא את המודל באמצעות קוד Python. בסוף התהליך ייווצר קובץ .tflite.
ב-codelab הבא נראה איך לערוך את אפליקציית Android כדי להשתמש במודל הזה, וכך להתחיל לסווג תגובות ספאם.