TensorFlow.js מספק פונקציונליות לשמירה וטעינה של מודלים שנוצרו עם Layers
API או שהומרו ממודלים קיימים של TensorFlow. אלו עשויים להיות מודלים שאימנתם בעצמכם או כאלו שאומנו על ידי אחרים. יתרון מרכזי בשימוש ב-Layers API הוא שהמודלים שנוצרו איתו ניתנים לסידרה וזה מה שנחקור במדריך זה.
מדריך זה יתמקד בשמירה וטעינה של דגמי TensorFlow.js (ניתן לזהות על ידי קבצי JSON). אנחנו יכולים גם לייבא דגמי TensorFlow Python. טעינת דגמים אלה מכוסה בשני המדריכים הבאים:
שמור tf.Model
tf.Model
ו- tf.Sequential
מספקים שניהם פונקציה model.save
המאפשרת לשמור את הטופולוגיה והמשקלים של המודל.
טופולוגיה: זהו קובץ המתאר את הארכיטקטורה של מודל (כלומר באילו פעולות הוא משתמש). הוא מכיל הפניות למשקלים של הדגמים המאוחסנים חיצונית.
משקלים: אלו הם קבצים בינאריים המאחסנים את המשקולות של מודל נתון בפורמט יעיל. הם מאוחסנים בדרך כלל באותה תיקיה כמו הטופולוגיה.
בואו נסתכל איך נראה הקוד לשמירת דגם
const saveResult = await model.save('localstorage://my-model-1');
יש לשים לב לכמה דברים:
- שיטת
save
לוקחת ארגומנט מחרוזת דמוי URL שמתחיל בסכמה . זה מתאר את סוג היעד אליו אנו מנסים לשמור דגם. בדוגמה למעלה הסכימה היאlocalstorage://
- אחרי הסכמה מופיע נתיב . בדוגמה למעלה הנתיב הוא
my-model-1
. - שיטת
save
היא אסינכרונית. - ערך ההחזרה של
model.save
הוא אובייקט JSON הנושא מידע כגון גודל הבתים של הטופולוגיה והמשקלים של המודל. - הסביבה המשמשת לשמירת המודל אינה משפיעה על אילו סביבות יכולות לטעון את המודל. שמירת דגם ב-node.js אינה מונעת את טעינתו בדפדפן.
להלן נבחן את התוכניות השונות הזמינות.
אחסון מקומי (דפדפן בלבד)
תוכנית: localstorage://
await model.save('localstorage://my-model');
זה שומר דגם תחת השם my-model
באחסון המקומי של הדפדפן. זה יימשך בין רענון, אם כי אחסון מקומי יכול להתבטל על ידי המשתמשים או הדפדפן עצמו אם מקום הופך לדאגה. כל דפדפן גם מגדיר מגבלה משלו לגבי כמות הנתונים שניתן לאחסן באחסון מקומי עבור דומיין נתון.
IndexedDB (דפדפן בלבד)
סכימה: indexeddb://
await model.save('indexeddb://my-model');
זה שומר מודל לאחסון IndexedDB של הדפדפן. כמו אחסון מקומי, הוא נמשך בין רענון לרענון, יש לו גם מגבלות גדולות יותר על גודל החפצים המאוחסנים.
הורדות קבצים (דפדפן בלבד)
סכימה: downloads://
await model.save('downloads://my-model');
זה יגרום לדפדפן להוריד את קבצי הדגם למחשב של המשתמש. יופקו שני קבצים:
- קובץ JSON טקסט בשם
[my-model].json
, הנושא את הטופולוגיה וההפניה לקובץ המשקולות המתואר להלן. - קובץ בינארי הנושא את ערכי המשקל בשם
[my-model].weights.bin
.
אתה יכול לשנות את השם [my-model]
כדי לקבל קבצים בשם אחר.
מכיוון שקובץ ה- .json
מצביע על ה- .bin
באמצעות נתיב יחסי, שני הקבצים צריכים להיות באותה תיקיה.
בקשת HTTP(S).
תוכנית: http://
או https://
await model.save('http://model-server.domain/upload')
פעולה זו תיצור בקשת אינטרנט לשמירת דגם בשרת מרוחק. אתה צריך להיות בשליטה על השרת המרוחק הזה כדי שתוכל להבטיח שהוא מסוגל לטפל בבקשה.
המודל יישלח לשרת HTTP שצוין באמצעות בקשת POST . גוף ה-POST הוא בפורמט multipart/form-data
ומורכב משני קבצים
- קובץ JSON טקסט בשם
model.json
, הנושא את הטופולוגיה וההפניה לקובץ המשקולות המתואר להלן. - קובץ בינארי הנושא את ערכי המשקל בשם
model.weights.bin
.
שימו לב שהשם של שני הקבצים תמיד יהיה בדיוק כפי שצוין למעלה (השם מובנה בפונקציה). מסמך API זה מכיל קטע קוד של Python המדגים כיצד ניתן להשתמש במסגרת האינטרנט של flask כדי לטפל בבקשה שמקורה ב- save
.
לעתים קרובות תצטרך להעביר ארגומנטים נוספים או כותרות בקשה לשרת ה-HTTP שלך (למשל לצורך אימות או אם ברצונך לציין תיקיה שבה יש לשמור את המודל). אתה יכול להשיג שליטה עדינה על היבטים אלה של הבקשות save
על ידי החלפת ארגומנט מחרוזת ה-URL ב- tf.io.browserHTTPRequest
. API זה מעניק גמישות רבה יותר בשליטה בבקשות HTTP.
לְדוּגמָה:
await model.save(tf.io.browserHTTPRequest(
'http://model-server.domain/upload',
{method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));
מערכת קבצים מקורית (Node.js בלבד)
סכימה: file://
await model.save('file:///path/to/my-model');
כשמריצים על Node.js יש לנו גם גישה ישירה למערכת הקבצים ויכולים לשמור שם דגמים. הפקודה למעלה תשמור שני קבצים path
שצוין לאחר scheme
.
- קובץ JSON טקסט בשם
[model].json
, הנושא את הטופולוגיה וההפניה לקובץ המשקולות המתואר להלן. - קובץ בינארי הנושא את ערכי המשקל בשם
[model].weights.bin
.
שימו לב שהשם של שני הקבצים תמיד יהיה בדיוק כפי שצוין למעלה (השם מובנה בפונקציה).
טוען tf.Model
בהינתן מודל שנשמר באחת מהשיטות לעיל, נוכל לטעון אותו באמצעות tf.loadLayersModel
API.
בואו נסתכל איך נראה הקוד לטעינת דגם
const model = await tf.loadLayersModel('localstorage://my-model-1');
יש לשים לב לכמה דברים:
- כמו
model.save()
, הפונקציהloadLayersModel
לוקחת ארגומנט מחרוזת דמוי URL שמתחיל בסכמה . זה מתאר את סוג היעד ממנו אנו מנסים לטעון דגם. - אחרי הסכמה מופיע נתיב . בדוגמה למעלה הנתיב הוא
my-model-1
. - ניתן להחליף את המחרוזת דמוית url באובייקט התואם לממשק IOHandler.
- הפונקציה
tf.loadLayersModel()
היא אסינכרונית. - ערך ההחזר של
tf.loadLayersModel
הואtf.Model
להלן נבחן את התוכניות השונות הזמינות.
אחסון מקומי (דפדפן בלבד)
תוכנית: localstorage://
const model = await tf.loadLayersModel('localstorage://my-model');
פעולה זו טוענת דגם בשם my-model
מהאחסון המקומי של הדפדפן .
IndexedDB (דפדפן בלבד)
סכימה: indexeddb://
const model = await tf.loadLayersModel('indexeddb://my-model');
פעולה זו טוענת דגם מאחסון IndexedDB של הדפדפן.
HTTP(S)
תוכנית: http://
או https://
const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');
זה טוען מודל מנקודת קצה http. לאחר טעינת קובץ json
הפונקציה תבצע בקשות לקבצי .bin
תואמים שקובץ json
מפנה אליהם.
מערכת קבצים מקורית (Node.js בלבד)
סכימה: file://
const model = await tf.loadLayersModel('file://path/to/my-model/model.json');
כאשר אנו פועלים על Node.js יש לנו גם גישה ישירה למערכת הקבצים ויכולים לטעון מודלים משם. שימו לב שבקריאת הפונקציה למעלה אנו מתייחסים לקובץ model.json עצמו (בעוד שבשמירה אנו מציינים תיקיה). קבצי .bin
המתאימים צריכים להיות באותה תיקיה כמו קובץ json
.
טוען דגמים עם IOHandlers
אם הסכמות לעיל אינן מספיקות לצרכים שלך, תוכל ליישם התנהגות טעינה מותאמת אישית עם IOHandler
. IOHandler
אחד ש-TensorFlow.js מספקת הוא tf.io.browserFiles
המאפשר למשתמשי דפדפן להעלות קבצי דגמים לדפדפן. עיין בתיעוד למידע נוסף.
שמירה וטעינה של דגמים עם IOHandlers מותאמים אישית
אם הסכימות שלמעלה אינן מספיקות לצרכי הטעינה או החיסכון שלך, תוכל ליישם התנהגות סריאליזציה מותאמת אישית על ידי הטמעת IOHandler
.
IOHandler
הוא אובייקט עם שיטת save
load
.
פונקציית save
לוקחת פרמטר אחד שתואם את ממשק ModelArtifacts וצריכה להחזיר הבטחה שנפתרת לאובייקט SaveResult .
פונקציית load
אינה לוקחת פרמטרים וצריכה להחזיר הבטחה שנפתרת לאובייקט ModelArtifacts . זהו אותו אובייקט שמועבר save
.
ראה BrowserHTTPRequest לקבלת דוגמה כיצד ליישם IOHandler.