1. מבוא
עשיתם את הצעדים הראשונים שלכם ב-TensorFlow.js, ניסיתם את המודלים המוכנים מראש שלנו או אולי אפילו יצרתם מודלים משלכם. אבל ראיתם כמה מחקר חדשני התבצע ב-Python ואתם סקרנים לדעת אם הוא יפעל בדפדפן האינטרנט כדי להפוך את הרעיון המגניב הזה למציאותי של מיליוני אנשים באופן שניתן להתאמה. נשמע לך מוכר? אם כן, זה ה-CodeLab בשבילכם!
צוות TensorFlow.js פיתח כלי נוח להמרת מודלים בפורמט SavedModel ל-TensorFlow.js באמצעות ממיר שורת פקודה, כך שתוכלו ליהנות מהשימוש במודלים כאלה עם טווח ההגעה וההיקף באינטרנט.
מה תלמדו
בשיעור ה-Lab הזה תלמדו איך להשתמש בממיר שורת הפקודה TensorFlow.js כדי לנייד מודל שנשמר ב-Python לפורמט model.json שנדרש להפעלה בצד הלקוח בדפדפן אינטרנט.
פרטים נוספים:
- איך ליצור מודל פשוט של למידת מכונה Python ולשמור אותו בפורמט הנדרש על ידי ממיר TensorFlow.js.
- איך להתקין את הממיר TensorFlow.js ולהשתמש בו ב-SavedModel שייצאתם מ-Python.
- לוקחים את הקבצים שנוצרו מההמרה ומשתמשים בהם באפליקציית האינטרנט של JS.
- תבינו מה לעשות כשמשהו משתבש (לא כל המודלים יומרו) ואילו אפשרויות עומדות לרשותכם.
נניח שיש לנו אפשרות לבצע מחקר חדש שפורסם ולהפוך את המודל הזה לזמין למיליוני מפתחי JS ברחבי העולם. או שאולי תשתמשו בה בעצמכם ביצירה משלכם, וכל אחד בעולם יוכל לחוות אותה אם הוא יפעל בדפדפן האינטרנט, כי לא נדרשת יחסי תלות מורכבים או הגדרת סביבה. מוכנים להאקינג? שנתחיל?
כדאי לשתף איתנו את ההמרות שאתם משלימים!
אתם יכולים להשתמש במה שלמדנו היום כדי לנסות להמיר כמה מהמודלים המועדפים עליכם מ-Python. אם אתם מצליחים לעשות זאת ואתם יוצרים אתר הדגמה פעיל של המודל בפעולה, תוכלו לתייג אותנו ברשתות החברתיות באמצעות ה-hashtag הבא: #MadeWithTFJS כדי לקבל הזדמנות להציג את הפרויקט שלכם בבלוג של TensorFlow ואפילו להציג ולספר על אירועים בעתיד. נשמח לראות עוד מחקרים מדהימים שמקורם באינטרנט ונאפשר למספר גדול יותר של אנשים להשתמש במודלים כאלה בדרכים חדשניות או יצירתיות, בדיוק כמו הדוגמה הנהדרת הזו.
2. מה זה TensorFlow.js?
TensorFlow.js היא ספריית למידת מכונה בקוד פתוח שיכולה לרוץ בכל מקום שבו JavaScript יכול. הוא מבוסס על ספריית TensorFlow המקורית שנכתבה ב-Python, ומטרתו ליצור מחדש את חוויית הפיתוח הזו ואת קבוצת ממשקי ה-API לסביבה העסקית של JavaScript.
איפה אפשר להשתמש בהן?
בגלל הניידות של JavaScript, עכשיו אפשר לכתוב בשפה אחת ולבצע למידת מכונה בקלות בכל הפלטפורמות הבאות:
- צד הלקוח בדפדפן האינטרנט שמשתמש ב-JavaScript וניל
- בצד השרת ואפילו מכשירים של IoT כמו Raspberry Pi שמשתמשים ב-Node.js
- אפליקציות למחשב באמצעות Electron
- אפליקציות נייטיב שמשתמשות ב-React Native
ב-TensorFlow.js יש גם תמיכה בכמה קצוות עורפיים בתוך כל אחת מהסביבות האלה (הסביבות בפועל שמבוססות על חומרה שבהן הוא יכול לפעול, כמו מעבד (CPU) או WebGL. "קצה עורפי" בהקשר הזה, לא מדובר בסביבה בצד השרת - הקצה העורפי להפעלה עשוי להיות בצד הלקוח ב-WebGL, למשל), כדי להבטיח תאימות וכדי להבטיח שהכול יפעל במהירות. נכון לעכשיו, ב-TensorFlow.js יש תמיכה:
- הפעלת WebGL בכרטיס הגרפי של המכשיר (GPU) – זו הדרך המהירה ביותר להפעיל מודלים גדולים יותר (בגודל של יותר מ-3MB) בעזרת האצת GPU.
- הפעלת Web Assembly (WASM) במעבד (CPU) – כדי לשפר את הביצועים של המעבד (CPU) בכל המכשירים, כולל, לדוגמה, טלפונים ניידים מדור קודם. הדבר מתאים יותר לדגמים קטנים יותר (פחות מ-3MB) שבפועל יכולים לפעול מהר יותר במעבד עם WASM מאשר ב-WebGL עקב התקורה של העלאת תוכן למעבד גרפי.
- הרצת המעבד (CPU) – החלופה לא אמורה להיות זמינה אף אחת מהסביבות האחרות. זאת האפשרות האיטית ביותר מבין השלושה, אבל היא תמיד כאן בשבילך.
הערה: אתם יכולים לאלץ את אחד מהקצוות העורפיים האלה אם אתם יודעים באיזה מכשיר אתם רוצים להפעיל, או פשוט לתת ל-TensorFlow.js להחליט בשבילכם אם לא תציינו זאת.
כוחות-על בצד הלקוח
הרצה של TensorFlow.js בדפדפן האינטרנט במחשב הלקוח יכולה להוביל לכמה יתרונות שכדאי לשקול.
פרטיות
תוכלו גם לאמן וגם לסווג נתונים במחשב הלקוח בלי לשלוח נתונים לשרת אינטרנט של צד שלישי. יכול להיות שבמקרים מסוימים תידרש ציות לחוקים מקומיים, כמו GDPR, או במהלך עיבוד נתונים שהמשתמש ירצה לשמור במחשב ולא לשלוח אותו לצד שלישי.
מהירות
מכיוון שאין צורך לשלוח נתונים לשרת מרוחק, ההסקה (פעולת סיווג הנתונים) יכולה להיות מהירה יותר. בנוסף, אם המשתמש מעניק לך גישה, יש לך גישה ישירה לחיישני המכשיר כמו המצלמה, המיקרופון, ה-GPS, מד התאוצה ועוד.
פוטנציאל חשיפה והיקף חשיפה
בלחיצה אחת כל אחד בעולם יכול ללחוץ על קישור שאתם שולחים לו, לפתוח את דף האינטרנט בדפדפן שלו ולהשתמש במה שיצרתם. אין צורך בהגדרה מורכבת של Linux בצד השרת עם מנהלי התקנים של CUDA, ועוד הרבה יותר רק כדי להשתמש במערכת למידת המכונה.
עלות
אין שרתים, כך שהדבר היחיד שאתם צריכים לשלם עליו הוא CDN לאירוח קובצי HTML, CSS, JS ומודל. העלות של CDN היא הרבה יותר זולה מאשר החזקה של שרת (יכול להיות עם כרטיס גרפי מצורף) שפועל 24/7.
תכונות בצד השרת
מינוף ההטמעה של Node.js של TensorFlow.js מאפשר את התכונות הבאות.
תמיכה מלאה ב-CUDA
בצד השרת, כדי לשפר את המהירות של כרטיסי מסך, צריך להתקין את מנהלי ההתקנים של NVIDIA CUDA כדי לאפשר ל-TensorFlow לעבוד עם כרטיס המסך (בניגוד לדפדפן שמשתמש ב-WebGL - לא נדרשת התקנה). אבל עם תמיכה מלאה ב-CUDA, אפשר לנצל את היכולות הנמוכות יותר של הכרטיס הגרפי וכך לקצר את זמני האימון והסקת המסקנות. הביצועים דומים להטמעה של TensorFlow ב-Python, כי לשניהם יש אותו קצה עורפי של C++.
גודל הדגם
כדי להשתמש במודלים מתקדמים ביותר ממחקרי מחקר, ייתכן שאתם עובדים עם מודלים גדולים מאוד, שעשויים להיות בגודל של ג'יגה-בייט. בשלב זה לא ניתן להפעיל מודלים אלה בדפדפן האינטרנט בשל מגבלות השימוש בזיכרון בכל כרטיסייה בדפדפן. כדי להריץ את המודלים הגדולים האלה, תוכלו להשתמש ב-Node.js בשרת שלכם עם מפרטי החומרה הנדרשים כדי להריץ מודל כזה ביעילות.
IOT
טכנולוגיית Node.js נתמכת במחשבים פופולריים עם לוח יחיד, כמו Raspberry Pi, וכתוצאה מכך אפשר להפעיל מודלים של TensorFlow.js גם במכשירים כאלה.
מהירות
Node.js נכתב ב-JavaScript, כלומר הוא מפיק תועלת מאיסוף נתונים בזמן. פירוש הדבר הוא שבמקרים רבים תראו שיפור בביצועים בזמן השימוש ב-Node.js, כי הוא יעבור אופטימיזציה בזמן הריצה, במיוחד בשלבי עיבוד מראש שאתם מבצעים. דוגמה מצוינת לכך אפשר לראות במקרה לדוגמה הזה, שמראה איך Hugging Face השתמש ב-Node.js כדי לשפר פי 2 את הביצועים של מודל עיבוד השפה הטבעי שלו.
עכשיו הבנת את היסודות של TensorFlow.js, איפה הוא יכול לפעול, וחלק מהיתרונות שלו, שנתחיל בו ולעשות איתו דברים מועילים!
3. הגדרת המערכת
במדריך זה נשתמש ב-Ubuntu – הפצת Linux פופולרית שאנשים רבים משתמשים בה. היא זמינה ב-Compute Engine של Google Cloud כתמונת בסיס אם בוחרים לעקוב אחר מכונה וירטואלית מבוססת-ענן.
בזמן הכתיבה, אנחנו יכולים לבחור את התמונה של Ubuntu 18.04.4 LTS במהלך יצירת מכונה חדשה של vanilla compute Engine שבה נשתמש. כמובן, תוכלו להשתמש במכונה שלכם או אפילו במערכת הפעלה אחרת אם תבחרו לעשות זאת, אבל הוראות ההתקנה ויחסי התלות עשויים להשתנות בין מערכות.
התקנת TensorFlow (גרסת Python)
אז, מכיוון שאתם כנראה מנסים להמיר מודל קיים מבוסס Python שמצאתם או תכתבו, לפני שנוכל לייצא "SavedModel" מ-Python, תצטרכו להגדיר את גרסת Python של TensorFlow במכונה אם 'SavedModel' כבר לא זמין להורדה.
SSH במחשב בענן שיצרתם למעלה ולאחר מכן מקלידים את הפקודה הבאה בחלון הטרמינל:
חלון טרמינל:
sudo apt update
sudo apt-get install python3
כך אפשר לוודא ש-Python 3 מותקן במחשב. כדי להשתמש ב-TensorFlow, צריך להתקין את Python מגרסה 3.4 ואילך.
כדי לוודא שהגרסה הנכונה מותקנת, מקלידים את הטקסט הבא:
חלון טרמינל:
python3 --version
אמור להופיע פלט מסוים שמציין את מספר הגרסה, למשל Python 3.6.9
. אם הערך מודפס כראוי והערך גבוה מ-3.4, אנחנו מוכנים להמשיך.
בשלב הבא נתקין את PIP עבור Python 3 שהוא מנהל החבילות של Python, ואז נעדכן אותו. סוג:
חלון טרמינל:
sudo apt install python3-pip
pip3 install --upgrade pip
שוב, אנחנו יכולים לאמת התקנת pip3 באמצעות:
חלון טרמינל:
pip3 --version
בזמן הכתיבה רואים את pip 20.2.3
מודפסת במסוף לאחר הרצת הפקודה הזו.
לפני שנוכל להתקין את TensorFlow, הוא מחייב את חבילת 'setuptools' של Python להיות בגרסה 41.0.0 ומעלה. מריצים את הפקודה הבאה כדי לוודא שהיא מעודכנת לגרסה העדכנית:
חלון טרמינל:
pip3 install -U setuptools
לסיום, עכשיו אנחנו יכולים להתקין את TensorFlow ל-Python:
חלון טרמינל:
pip3 install tensorflow
השלמת הפעולה תימשך זמן מה, לכן עליך להמתין עד לסיום ההפעלה.
צריך לבדוק ש-TensorFlow הותקן כמו שצריך. יוצרים קובץ Python בשם test.py
בספרייה הנוכחית:
חלון טרמינל:
nano test.py
אחרי פתיחת ה-nano, אנחנו יכולים לכתוב קוד Python כדי להדפיס את גרסת TensorFlow שמותקנת:
test.py:
import tensorflow as tf
print(tf.__version__)
מקישים על CTRL + O
כדי לכתוב את השינויים בדיסק ואז על CTRL + X
כדי לצאת מעורך הננו.
עכשיו אנחנו יכולים להריץ את קובץ Python הזה כדי לראות את הגרסה של TensorFlow המודפסת במסך:
חלון טרמינל:
python3 test.py
בזמן הכתיבה אנחנו רואים את 2.3.1
מודפסים במסוף לגבי גרסת TensorFlow Python שמותקנת.
4. יצירת מודל Python
בשלב הבא ב-Codelab הזה מתואר איך ליצור מודל Python פשוט, כדי להראות איך אפשר לשמור את המודל המאומן שמתקבל ב-SavedModel להשתמש בו עם ממיר שורת הפקודה TensorFlow.js. העיקרון אמור להיות דומה לכל מודל Python שניסית להמיר, אבל אנחנו נעשה את זה פשוט כדי שכולם יוכלו להבין.
נערוך את קובץ test.py שיצרנו בחלק הראשון ונעדכן את הקוד באופן הבא:
test.py:
import tensorflow as tf
print(tf.__version__)
# Import NumPy - package for working with arrays in Python.
import numpy as np
# Import useful keras functions - this is similar to the
# TensorFlow.js Layers API functionality.
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
# Create a new dense layer with 1 unit, and input shape of [1].
layer0 = Dense(units=1, input_shape=[1])
model = Sequential([layer0])
# Compile the model using stochastic gradient descent as optimiser
# and the mean squared error loss function.
model.compile(optimizer='sgd', loss='mean_absolute_error')
# Provide some training data! Here we are using some fictional data
# for house square footage and house price (which is simply 1000x the
# square footage) which our model must learn for itself.
xs = np.array([800.0, 850.0, 900.0, 950.0, 980.0, 1000.0, 1050.0, 1075.0, 1100.0, 1150.0, 1200.0, 1250.0, 1300.0, 1400.0, 1500.0, 1600.0, 1700.0, 1800.0, 1900.0, 2000.0], dtype=float)
ys = np.array([800000.0, 850000.0, 900000.0, 950000.0, 980000.0, 1000000.0, 1050000.0, 1075000.0, 1100000.0, 1150000.0, 1200000.0, 1250000.0, 1300000.0, 1400000.0, 1500000.0, 1600000.0, 1700000.0, 1800000.0, 1900000.0, 2000000.0], dtype=float)
# Train the model for 500 epochs.
model.fit(xs, ys, epochs=500, verbose=0)
# Test the trained model on a test input value
print(model.predict([1200.0]))
# Save the model we just trained to the "SavedModel" format to the
# same directory our test.py file is located.
tf.saved_model.save(model, './')
הקוד הזה יאמן רגרסיה ליניארית פשוטה מאוד כדי ללמוד להעריך את הקשר בין ה-x (הקלט) לבין ה-y (פלטים) שסופקו. לאחר מכן נשמור בדיסק את המודל שעבר אימון. לפרטים נוספים על הפעולות שמבצעים בכל שורה, מומלץ לבדוק את התגובות בגוף ההודעה.
אם נבדוק את הספרייה שלנו אחרי הרצת התוכנית (באמצעות קריאה ל-python3 test.py
), נוכל לראות עכשיו כמה קבצים ותיקיות חדשים שנוצרו בספרייה הנוכחית שלנו:
- test.py
- saved_model.pb
- נכסים
- משתנים
עכשיו יצרנו את הקבצים שדרושים לממיר TensorFlow.js כדי להמיר את המודל הזה להרצה בדפדפן.
5. המרה של SaveModel לפורמט TensorFlow.js
התקנת הממיר של TensorFlow.js
כדי להתקין את הממיר, מריצים את הפקודה הבאה:
חלון טרמינל:
pip3 install tensorflowjs
זה היה קל.
בהנחה שהשתמשנו בממיר שורת הפקודה (tensorflowjs_converter
) ולא בגרסת האשף המוצגת למעלה, אנחנו יכולים לקרוא לפקודה הבאה כדי להמיר את המודל השמור שיצרנו, ולהעביר את הפרמטרים באופן מפורש לממיר:
חלון טרמינל:
tensorflowjs_converter \
--input_format=keras_saved_model \
./ \
./predict_houses_tfjs
מה קורה פה? ראשית אנחנו קוראים לקובץ הבינארי של tensorflowjs_converter שהתקנו עכשיו, ומציינים שאנחנו מנסים להמיר מודל keras שנשמר.
בקוד לדוגמה שלמעלה תוכלו לראות שייבאנו keras והשתמשנו בממשקי ה-API בשכבות הגבוהות יותר של המודל כדי ליצור את המודל. אם לא השתמשתם ב-keras בקוד Python, כדאי להשתמש בפורמט קלט אחר:
- keras - לטעינת פורמט keras (סוג קובץ HDF5)
- tf_saved_model – כדי לטעון מודל שמשתמש בממשקי API של ליבה tensorflow במקום ב-keras.
- tf_frozen_model – לטעינת מודל שמכיל משקולות קפואות.
- tf_hub - כדי לטעון מודל שנוצר מ-tensorflow Hub.
מידע נוסף על הפורמטים האלה זמין כאן.
שני הפרמטרים הבאים מציינים באיזו תיקייה המודל שנשמר נמצא – בהדגמה שלמעלה אנחנו מציינים את הספרייה הנוכחית, ולבסוף מציינים את הספרייה שאליה אנחנו רוצים להפיק את הפלט של ההמרה. בדוגמה שלמעלה אנחנו מציינים אותה כתיקייה בשם 'predict_houses_tfjs
' בספרייה הנוכחית.
אם מריצים את הפקודה הזו, יוצרים תיקייה חדשה בספרייה הנוכחית בשם predict_houses_tfjs
שמכילה את :
- model.json
- Group1-shard1of1.bin
אלה הקבצים שדרושים לנו כדי להריץ את המודל בדפדפן האינטרנט. שומרים את הקבצים כי נשתמש בהם בקטע הבא.
6. שימוש במודל שהומר בדפדפן
אירוח הקבצים שהומרו
קודם כל צריך למקם את model.json
ואת *.bin
הקבצים שנוצרו בשרת אינטרנט כדי שנוכל לגשת אליהם דרך דף האינטרנט שלנו. לצורך ההדגמה הזו נשתמש בכתובת Glitch.com כדי שיהיה לכם קל לעקוב אחריכם. עם זאת, אם אתם משתמשים מרקע של הנדסת אינטרנט, תוכלו להפעיל שרת http פשוט במופע של שרת ה-Ubuntu הנוכחי כדי לעשות זאת. הבחירה היא שלך.
העלאת קבצים ל-Glitch
- נכנסים אל Glitch.com
- אפשר להשתמש בקישור הזה כדי לשכפל את פרויקט TensorFlow.js עם התבנית הסטנדרטית שלנו. הוא מכיל קובצי HTML בסיסיים, css ו-js שמייבאים את ספריית TensorFlow.js מוכנה לשימוש.
- לוחצים על 'נכסים'. תיקייה בחלונית השמאלית.
- צריך ללחוץ על 'העלאת נכס' ובוחרים את
group1-shard1of1.bin
כדי להעלות אותם לתיקייה הזו. אחרי ההעלאה, הקובץ אמור להיראות כך: - לחיצה על הקובץ
group1-shard1of1.bin
שהעלית עכשיו תאפשר לך להעתיק את כתובת ה-URL למיקום שלו. העתקת הנתיב הזה עכשיו כפי שמוצג: - עכשיו עורכים את
model.json
באמצעות עורך הטקסט המועדף עליכם במחשב המקומי ומחפשים (באמצעות CTRL+F) את הקובץgroup1-shard1of1.bin
שיוזכר במקום כלשהו בו.
מחליפים את שם הקובץ בכתובת ה-URL שהעתקתם בשלב 5, אבל מוחקים את https://cdn.glitch.com/
המוביל שהתקלה יצרה מהנתיב שהועתק.
אחרי העריכה הוא אמור להיראות בערך כך (שימו לב איך נתיב השרת המוביל הוסר כך שרק שם הקובץ שהועלה יישמר): 7. עכשיו שומרים ומעלים את קובץ model.json
הערוך כדי לתקלה: לוחצים על נכסים, ואז לוחצים על 'העלאת נכס' הלחצן (חשוב). אם לא תשתמשו בלחצן הפיזי, תגרור ומשחררים אותו, הוא יועלה כקובץ שניתן לעריכה במקום ב-CDN, שלא יהיה באותה תיקייה. ההנחה היא ש-TensorFlow.js ינסה להוריד את הקבצים הבינאריים למודל נתון. אם ביצעת את הפעולה כראוי, אמורים להופיע בתיקייה assets
2 קבצים:
נהדר! עכשיו אנחנו מוכנים להשתמש בקבצים השמורים שלנו עם קוד אמיתי בדפדפן.
טעינת המודל
עכשיו, לאחר שאירחנו את הקבצים המומרים, אנחנו יכולים לכתוב דף אינטרנט פשוט כדי לטעון את הקבצים האלה ולהשתמש בהם כדי לבצע חיזוי. יש לפתוח את script.js
בתיקיית הפרויקט Glitch ולהחליף את תוכן הקובץ הזה בתוכן הבא אחרי ששינית את ה-const MODEL_URL
, כך שיצביע על הקישור שנוצר ל-Glitch.com עבור הקובץ model.json
שהעלית ב-Glitch:
script.js:
// Grab a reference to our status text element on the web page.
// Initially we print out the loaded version of TFJS.
const status = document.getElementById('status');
status.innerText = 'Loaded TensorFlow.js - version: ' + tf.version.tfjs;
// Specify location of our Model.json file we uploaded to the Glitch.com CDN.
const MODEL_URL = ‘YOUR MODEL.JSON URL HERE! CHANGE THIS!';
// Specify a test value we wish to use in our prediction.
// Here we use 950, so we expect the result to be close to 950,000.
const TEST_VALUE = 950.0
// Create an asynchronous function.
async function run() {
// Load the model from the CDN.
const model = await tf.loadLayersModel(MODEL_URL);
// Print out the architecture of the loaded model.
// This is useful to see that it matches what we built in Python.
console.log(model.summary());
// Create a 1 dimensional tensor with our test value.
const input = tf.tensor1d([TEST_VALUE]);
// Actually make the prediction.
const result = model.predict(input);
// Grab the result of prediction using dataSync method
// which ensures we do this synchronously.
status.innerText = 'Input of ' + TEST_VALUE +
'sqft predicted as $' + result.dataSync()[0];
}
// Call our function to start the prediction!
run();
הרצת הקוד שלמעלה אחרי שמשנים את הקבוע MODEL_URL
כדי שיצביע על הנתיב model.json
יוביל לפלט המוצג למטה.
אם נבדוק את המסוף של דפדפן האינטרנט (צריך להקיש על F12 כדי להציג את הכלים למפתחים בדפדפן), נוכל לראות גם את תיאור הדגם של המודל שנטען, שמודפס:
כשנשווה את הנתונים האלה לקוד Python שלנו בתחילת ה-Codelab, נוכל לאשר שזו אותה הרשת שיצרנו באמצעות קלט צפוף אחד ושכבה אחת צפופה עם צומת אחד.
מעולה! בדיוק הרצת מודל Python שהומר בדפדפן האינטרנט!
7. מודלים שלא מבצעים המרה
במקרים מסוימים לא תהיה תמיכה במודלים מורכבים יותר שעברו הידור כדי להשתמש בפעולות פחות נפוצות. הגרסה שמבוססת על הדפדפן TensorFlow.js היא שכתוב מלא של TensorFlow, ולכן אנחנו לא תומכים כרגע בכל הפעולות ברמה הנמוכה של TensorFlow C++ API (יש 1,000 שניות), אבל עם הזמן נוספות עוד אפשרויות ככל שיגדלו וכשפעולות הליבה יהיו יציבות יותר.
בזמן הכתיבה, פונקציה כזו ב-TensorFlow Python שיוצרת פעולה שאינה נתמכת במהלך ייצוא כמודל שמור היא linalg.diag
. אם ננסה להמיר מודל שמור שמשתמש ב-Python (המודל הזה תומך בפעולות שהן יוצרות), תתקבל שגיאה שדומה לזו:
כאן אפשר לראות מודגשת באדום שהקריאה של linalg.diag
עברה הידור כדי ליצור פעולה בשם MatrixDiagV3
, שלא נתמכת על ידי TensorFlow.js בדפדפן האינטרנט בזמן כתיבת ה-Codelab הזה.
מה צריך לעשות?
לרשותך שתי אפשרויות.
- הטמעת הפעולה החסרה הזו ב-TensorFlow.js – אנחנו פרויקט קוד פתוח ואנחנו מקבלים תרומות לדברים כמו פעולות חדשות. במדריך הזה מוסבר על כתיבת פעולות חדשות ב-TensorFlow.js. אם תצליחו לעשות זאת, תוכלו להשתמש בדגל
Skip_op_check
בממיר שורת הפקודה שלנו כדי להתעלם מהשגיאה הזו ולהמשיך לבצע המרה בכל מקרה (המערכת תניח שה-op הזה זמין ב-build החדש של TensorFlow.js שיצרתם עם תמיכה ב-op חסרה). - בודקים איזה חלק בקוד Python יצר את הפעולה שאינה נתמכת בקובץ
savedmodel
שייצאתם. בקבוצות קוד קטנות, יכול להיות שיהיה קל לאתר את זה, אבל במודלים מורכבים יותר זה עשוי להצריך קצת חקירה, כי אין כרגע שיטה לזיהוי ההפעלה ברמה הגבוהה של פונקציית Python שהניבה פעולה נתונה פעם אחת בפורמט הקובץsavedmodel
. עם זאת, לאחר איתור כתובת ה-URL, אפשר לשנות אותה ולהשתמש בשיטה אחרת שנתמכת.
8. מזל טוב
כל הכבוד, ביצעת את הצעדים הראשונים בשימוש במודל Python דרך TensorFlow.js בדפדפן האינטרנט!
סיכום
בשיעור ה-Lab הזה הקוד למדנו איך:
- הגדרת סביבת Linux שלנו כדי להתקין את TensorFlow מבוסס Python
- ייצוא קובץ 'SavedModel' של Python
- התקנה של ממיר שורת הפקודה TensorFlow.js
- שימוש בממיר שורת הפקודה TensorFlow.js כדי ליצור את הקבצים הנדרשים בצד הלקוח
- שימוש בקבצים שנוצרו באפליקציית אינטרנט אמיתית
- לזהות את המודלים שלא יניבו המרות ואת מה שצריך להטמיע כדי לאפשר להם לבצע המרה בעתיד.
מה השלב הבא?
אל תשכחו לתייג אותנו בכל דבר שאתם יוצרים באמצעות #MadeWithTFJS כדי שתהיה לך הזדמנות להופיע ברשתות החברתיות או אפילו להופיע באירועים עתידיים של TensorFlow. נשמח לראות מה אתה ממיר ומשתמש בצד הלקוח בדפדפן!
כדי להעמיק את התרגול באמצעות Codelabs נוספים ב-TensorFlow.js
- כתיבה של רשת נוירונים מאפס ב-TensorFlow.js
- יצירת מצלמת אינטרנט חכמה שיכולה לזהות אובייקטים
- סיווג תמונות בהתאמה אישית באמצעות למידת העברה ב-TensorFlow.js